Setup

We will clean the environment, setup the locations, define colors, and create a datestamp.

Clean the environment.

Set locations and working directories…


Create a new analysis directories.

- general directory

- for plots

- for output of summary results

- for baseline tables

- for genetic analyses

- for Cox regression results

… a package-installation function …

source("scripts/functions.R")

… and load those packages.

source("scripts/packages05.R")
If prompted for GitHub credentials, enter your PAT in the password field
Using GITHUB_PAT from Sander W. van der Laan (credential helper: osxkeychain)
Using github PAT from envvar GITHUB_PAT
Skipping install of 'patchwork' from a github remote, the SHA1 (79223d30) has not changed since last install.
  Use `force = TRUE` to force installation
Using github PAT from envvar GITHUB_PAT
Skipping install of 'RACER' from a github remote, the SHA1 (1394c9d4) has not changed since last install.
  Use `force = TRUE` to force installation

We will create a datestamp and define the Utrecht Science Park Colour Scheme.


Today = format(as.Date(as.POSIXlt(Sys.time())), "%Y%m%d")
Today.Report = format(as.Date(as.POSIXlt(Sys.time())), "%A, %B %d, %Y")

source("scripts/colors.R")

Introduction

We will parse the data to create regional association plots for each of the 11 loci.

Setting the NPG colors

library("scales")
pal_npg("nrc")(10)
 [1] "#E64B35FF" "#4DBBD5FF" "#00A087FF" "#3C5488FF" "#F39B7FFF" "#8491B4FF" "#91D1C2FF" "#DC0000FF" "#7E6148FF"
[10] "#B09C85FF"
show_col(pal_npg("nrc")(10))


# show_col(pal_npg("nrc", alpha = 0.6)(10))

Load data

European and African-American

We need to load the meta-analysis summary statistics from the European - African-American ancestry analysis first.


gwas_sumstats_racer_EA_AA <- readRDS(file = paste0(OUT_loc, "/gwas_sumstats_complete_racer.EA_AA.rds"))

European-only

We need to load the meta-analysis summary statistics from the European-only ancestry analysis.


# gwas_sumstats_EA <- fread(paste0(GWAS_loc,"/CAC1000G_EA_FINAL_FUMA.txt.gz"),
#                          showProgress = TRUE)
# names(gwas_sumstats_EA)[names(gwas_sumstats_EA) == "Pos"] <- "Position"
# saveRDS(gwas_sumstats_EA, file = paste0(OUT_loc, "/gwas_sumstats.EA.rds"))
# 
# gwas_sumstats_racer_EA <- subset(gwas_sumstats_EA,
#                               select = c("MarkerName", "rsID", "Chr", "Position", "Pvalue"))
# 
# saveRDS(gwas_sumstats_racer_EA, file = paste0(OUT_loc, "/gwas_sumstats_racer.EA.rds"))
# rm(gwas_sumstats_EA)

gwas_sumstats_racer_EA <- readRDS(file = paste0(OUT_loc, "/gwas_sumstats_racer.EA.rds"))

African-American-only

We need to load the meta-analysis summary statistics from the African-American-only ancestry analysis.

# gwas_sumstats_unfiltered_AA <- fread(paste0(GWAS_loc,"/CAC1000G_AA_FINAL_FUMA.unfiltered.txt.gz"),
#                          showProgress = TRUE)
# saveRDS(gwas_sumstats_unfiltered_AA, file = paste0(OUT_loc, "/gwas_sumstats_unfiltered.AA.rds"))

# gwas_sumstats_racer_unfiltered_AA <- subset(gwas_sumstats_unfiltered_AA,
#                               select = c("MarkerName", "rsID", "Chr", "Position", "Pvalue"))
# 
# saveRDS(gwas_sumstats_racer_unfiltered_AA, file = paste0(OUT_loc, "/gwas_sumstats_unfiltered_racer.AA.rds"))
# 
# gwas_sumstats_racer_unfiltered_AA <- readRDS(file = paste0(OUT_loc, "/gwas_sumstats_unfiltered_racer.AA.rds"))

# 
# gwas_sumstats_AA <- fread(paste0(GWAS_loc,"/CAC1000G_AA_FINAL_FUMA.filtered.txt.gz"),
#                          showProgress = TRUE)
# saveRDS(gwas_sumstats_AA, file = paste0(OUT_loc, "/gwas_sumstats.AA.rds"))
# 
# gwas_sumstats_racer_AA <- subset(gwas_sumstats_AA,
#                               select = c("MarkerName", "rsID", "Chr", "Position", "Pvalue"))
# 
# saveRDS(gwas_sumstats_racer_AA, file = paste0(OUT_loc, "/gwas_sumstats_racer.AA.rds"))
# rm(gwas_sumstats_AA)
gwas_sumstats_racer_AA <- readRDS(file = paste0(OUT_loc, "/gwas_sumstats_racer.AA.rds"))

Regional association plotting: EU-AA-ancestry

Top 11 loci

We are interested in 11 top loci. We will plot these using the EU-AA-ancestry data.

library(openxlsx)
variant_list <- read.xlsx(paste0(TARGET_loc, "/Variants.xlsx"), sheet = "TopLoci")

DT::datatable(variant_list)
NA

All loci

Let’s do some plotting.

library(RACER)
# Make directory for plots
ifelse(!dir.exists(file.path(PROJECT_loc, "/RACER")), 
       dir.create(file.path(PROJECT_loc, "/RACER")), 
       FALSE)
[1] FALSE
RACER_loc = paste0(PROJECT_loc,"/RACER")

variants_of_interest <- c(variant_list$rsID)

variants_of_interest_fewgenes <- c("rs9349379")#, "rs3844006", "rs2854746", "rs4977575", "rs9633535", "rs11063120", "rs9515203", "rs7182103")

for(VARIANT in variants_of_interest){
  cat(paste0("Getting data for ", VARIANT,".\n"))

  tempCHR <- subset(variant_list, rsID == VARIANT)[,5]
  tempSTART <- subset(variant_list, rsID == VARIANT)[,17]
  tempEND <- subset(variant_list, rsID == VARIANT)[,18]
  tempVARIANTnr <- subset(variant_list, rsID == VARIANT)[,1]

  cat("\nSubset required data.\n")
  temp <- subset(gwas_sumstats_racer_EA_AA, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))
  
  cat("\nFormatting association data.\n")
  temp_f = RACER::formatRACER(assoc_data = temp, chr_col = 3, pos_col = 4, p_col = 5)

  cat("\nGetting LD data.\n")
  temp_f_ld = RACER::ldRACER(assoc_data = temp_f, rs_col = 2, pops = "EUR", lead_snp = VARIANT)
  
  cat(paste0("\nPlotting region surrounding ", VARIANT," on ",tempCHR,":",tempSTART,"-",tempEND,".\n"))
  p1 <- singlePlotRACER2(assoc_data = temp_f_ld, 
                               chr = tempCHR, build = "hg19", 
                               plotby = "snp", snp_plot = VARIANT,
                               label_lead = TRUE, gene_track_h = 2, gene_name_s = 1.75)
  
  print(p1)
  cat(paste0("Saving image for ", VARIANT,".\n"))
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.png"), plot = last_plot())
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.pdf"), plot = last_plot())
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.eps"), plot = last_plot())

  # rm(temp, p1,
  #    temp_f, temp_f_ld,
  #    tempCHR, tempSTART, tempEND,
  #    VARIANT, tempVARIANTnr)
  
}
Getting data for rs9349379.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9349379...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9349379&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [45%] Downloaded 32210 bytes...
 [100%] Downloaded 70967 bytes...
Merging input association data with LD...

Plotting region surrounding rs9349379 on 6:12403957-13403957.
Plotting by...
snp rs9349379
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs9349379.
Getting data for rs3844006.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs3844006...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs3844006&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 31016 bytes...
Merging input association data with LD...

Plotting region surrounding rs3844006 on 6:131595002-132595002.
Plotting by...
snp rs3844006
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs3844006.
Getting data for rs2854746.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs2854746...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs2854746&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [44%] Downloaded 49152 bytes...
 [59%] Downloaded 65518 bytes...
 [74%] Downloaded 81920 bytes...
 [89%] Downloaded 98286 bytes...
 [100%] Downloaded 109298 bytes...
Merging input association data with LD...

Plotting region surrounding rs2854746 on 7:45460645-46460645.
Plotting by...
snp rs2854746
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs2854746.
Getting data for rs4977575.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs4977575...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs4977575&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 26000 bytes...
Merging input association data with LD...

Plotting region surrounding rs4977575 on 9:21624744-22624744.
Plotting by...
snp rs4977575
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs4977575.
Getting data for rs10899970.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10899970...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10899970&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [35%] Downloaded 57344 bytes...
 [56%] Downloaded 90112 bytes...
 [100%] Downloaded 160476 bytes...
Merging input association data with LD...

Plotting region surrounding rs10899970 on 10:44015716-45334720.
Plotting by...
snp rs10899970
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs10899970.
Getting data for rs9633535.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9633535...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9633535&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 49363 bytes...
Merging input association data with LD...

Plotting region surrounding rs9633535 on 10:63336088-64336088.
Plotting by...
snp rs9633535
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs9633535.
Getting data for rs10762577.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10762577...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10762577&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 92997 bytes...
Merging input association data with LD...

Plotting region surrounding rs10762577 on 10:75417431-76417431.
Plotting by...
snp rs10762577
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs10762577.
Getting data for rs11063120.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs11063120...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs11063120&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 41883 bytes...
Merging input association data with LD...

Plotting region surrounding rs11063120 on 12:3986618-4986618.
Plotting by...
snp rs11063120
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs11063120.
Getting data for rs9515203.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9515203...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9515203&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 30139 bytes...
Merging input association data with LD...

Plotting region surrounding rs9515203 on 13:110549623-111549623.
Plotting by...
snp rs9515203
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs9515203.
Getting data for rs7182103.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7182103...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7182103&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [27%] Downloaded 32209 bytes...
 [76%] Downloaded 90112 bytes...
 [100%] Downloaded 118299 bytes...
Merging input association data with LD...

Plotting region surrounding rs7182103 on 15:78623946-79623946.
Plotting by...
snp rs7182103
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs7182103.
Getting data for rs7412.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7412...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7412&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 38865 bytes...
Merging input association data with LD...

Plotting region surrounding rs7412 on 19:44912079-45912079.
Plotting by...
snp rs7412
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs7412.

Loci with many genes

These are genetic loci with many genes.


variants_of_interest_manygenes <- c("rs7412", "rs10762577")

for(VARIANT in variants_of_interest_manygenes){
  cat(paste0("Getting data for ", VARIANT,".\n"))

  tempCHR <- subset(variant_list, rsID == VARIANT)[,5]
  tempSTART <- subset(variant_list, rsID == VARIANT)[,17]
  tempEND <- subset(variant_list, rsID == VARIANT)[,18]
  tempVARIANTnr <- subset(variant_list, rsID == VARIANT)[,1]

  cat("\nSubset required data.\n")
  temp <- subset(gwas_sumstats_racer_EA_AA, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))
  
  cat("\nFormatting association data.\n")
  temp_f = RACER::formatRACER(assoc_data = temp, chr_col = 3, pos_col = 4, p_col = 5)

  cat("\nGetting LD data.\n")
  temp_f_ld = RACER::ldRACER(assoc_data = temp_f, rs_col = 2, pops = "EUR", lead_snp = VARIANT)
  
  cat(paste0("\nPlotting region surrounding ", VARIANT," on ",tempCHR,":",tempSTART,"-",tempEND,".\n"))
  p1 <- singlePlotRACER2(assoc_data = temp_f_ld, 
                               chr = tempCHR, build = "hg19", 
                               plotby = "snp", snp_plot = VARIANT,
                               label_lead = TRUE, gene_track_h = 0.75, gene_name_s = 1.75)
  
  print(p1)
  cat(paste0("Saving image for ", VARIANT,".\n"))
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.png"), plot = last_plot())
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.pdf"), plot = last_plot())
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.eps"), plot = last_plot())
  
  rm(temp, p1,
     temp_f, temp_f_ld,
     tempCHR, tempSTART, tempEND,
     VARIANT, tempVARIANTnr)
  
}
Getting data for rs7412.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7412...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7412&pop=EUR&r2_d=r2&token=c0f613f149ab"
Merging input association data with LD...

Plotting region surrounding rs7412 on 19:44912079-45912079.
Plotting by...
snp rs7412
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs7412.
Getting data for rs10762577.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10762577...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10762577&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [52%] Downloaded 48576 bytes...
 [59%] Downloaded 55496 bytes...
 [77%] Downloaded 71862 bytes...
 [100%] Downloaded 92997 bytes...
Merging input association data with LD...

Plotting region surrounding rs10762577 on 10:75417431-76417431.
Plotting by...
snp rs10762577
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs10762577.

CXCL12

The CXCL12 genetic locus.

variants_of_interest_cxcl12 <- c("rs10899970")

for(VARIANT in variants_of_interest_cxcl12){
  cat(paste0("Getting data for ", VARIANT,".\n"))

  tempCHR <- subset(variant_list, rsID == VARIANT)[,5]
  tempSTART <- subset(variant_list, rsID == VARIANT)[,17]
  tempEND <- subset(variant_list, rsID == VARIANT)[,18]
  tempVARIANTnr <- subset(variant_list, rsID == VARIANT)[,1]

  cat("\nSubset required data.\n")
  temp <- subset(gwas_sumstats_racer_EA_AA, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))
  
  cat("\nFormatting association data.\n")
  temp_f = RACER::formatRACER(assoc_data = temp, chr_col = 3, pos_col = 4, p_col = 5)

  cat("\nGetting LD data.\n")
  temp_f_ld = RACER::ldRACER(assoc_data = temp_f, rs_col = 2, pops = "EUR", lead_snp = VARIANT)
  
  cat(paste0("\nPlotting region surrounding ", VARIANT," on ",tempCHR,":",tempSTART,"-",tempEND,".\n"))
  p1 <- singlePlotRACER2(assoc_data = temp_f_ld, 
                               chr = tempCHR, build = "hg19", set = "all",
                               plotby = "snp", snp_plot = VARIANT,
                               label_lead = TRUE, gene_track_h = 0.75, gene_name_s = 1.75)
  
  print(p1)
  cat(paste0("Saving image for ", VARIANT,".\n"))
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.png"), plot = last_plot())
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.pdf"), plot = last_plot())
  # ggsave(filename = paste0(RACER_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.eps"), plot = last_plot())
  
  rm(temp, p1,
     temp_f, temp_f_ld,
     tempCHR, tempSTART, tempEND,
     VARIANT, tempVARIANTnr)
  
}
Getting data for rs10899970.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10899970...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10899970&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [45%] Downloaded 73710 bytes...
 [86%] Downloaded 139246 bytes...
 [100%] Downloaded 160476 bytes...
Merging input association data with LD...

Plotting region surrounding rs10899970 on 10:44015716-45334720.
Plotting by...
snp rs10899970
Reading in association data
Determining lead SNP
Generating Plot
Saving image for rs10899970.

Additional regional plots

Listing regions of interest

We want to create some regional association plots to combine with teh UCSC browser tracks, thus we need the exact same regions.

library(openxlsx)
add_list <- read.xlsx(paste0(TARGET_loc, "/Variants.xlsx"), sheet = "AdditionalPlots")

DT::datatable(add_list)
NA

Credible Sets

We want to color the credible sets, which we load here.

credset <- as_tibble(fread(paste0(PROJECT_loc, "/CredibleSets/CAC_EUR_AFR_cred_set_all_loci_50kb.txt")))

credset

Combining GWAS with Credible Set

We want to add the posterior probabilities and make a variable to color by.


gwas_sumstats_racer_credset <- merge(gwas_sumstats_racer_EA_AA, 
                                     credset %>% select(RSID, Posterior_Prob), 
                                     sort = FALSE,
                                     by.x = "rsID", by.y = "RSID", all.x = TRUE) %>%
  # mutate(., Posterior_Prob = ifelse(is.na(Posterior_Prob), 0, Posterior_Prob)) %>%
  mutate(CredSet = case_when(Posterior_Prob > 0 ~ '95% credible set',
                             TRUE ~ 'not in credible set'))

head(gwas_sumstats_racer_credset)

table(gwas_sumstats_racer_credset$CredSet)

   95% credible set not in credible set 
                103             8585944 
summary(gwas_sumstats_racer_credset$Posterior_Prob)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      0       0       0       0       0       1 8585944 

Plotting

library(RACER)
# library(plotly)

# Make directory for plots
ifelse(!dir.exists(file.path(PROJECT_loc, "/RACER")), 
       dir.create(file.path(PROJECT_loc, "/RACER")), 
       FALSE)
[1] FALSE
RACER_loc = paste0(PROJECT_loc,"/RACER")

variants_of_interest <- c(add_list$rsID)


for(VARIANT in variants_of_interest){
  cat(paste0("Getting data for ", VARIANT,".\n"))

  tempCHR <- subset(add_list, rsID == VARIANT)[,4]
  tempSTART <- subset(add_list, rsID == VARIANT)[,5]
  tempEND <- subset(add_list, rsID == VARIANT)[,6]
  tempNAME <- subset(add_list, rsID == VARIANT)[,3]

  cat("\nSubset required data.\n")
  temp <- subset(gwas_sumstats_racer_credset, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))
  
  cat("\nFormatting association data.\n")
  temp_f = RACER::formatRACER(assoc_data = temp, chr_col = 3, pos_col = 4, p_col = 5)

  cat("\nGetting LD data.\n")
  # temp_f_ld = RACER::ldRACER(assoc_data = temp_f, rs_col = 2, pops = "EUR", lead_snp = VARIANT)
  
  cat(paste0("\nPlotting region surrounding ", VARIANT," on ",tempCHR,":",tempSTART,"-",tempEND,".\n"))
  
  p1 <- singlePlotRACER2(assoc_data = temp_f, 
                         chr = tempCHR, build = "hg19", 
                         plotby = "coord", snp_plot = VARIANT,
                         start_plot = tempSTART, end_plot = tempEND,
                         label_lead = FALSE, 
                         grey_colors = FALSE, 
                         cred_set = TRUE, 
                         gene_track_h = 3, gene_name_s = 1.75)
  
  print(p1)
  
  cat(paste0("Saving image for ", VARIANT,".\n"))
  # ggsave(filename = paste0(RACER_loc, "/", tempNAME, ".", Today, ".",VARIANT,".",tempSTART,".",tempEND,".regional_assoc.png"), plot = p1)
  # ggsave(filename = paste0(RACER_loc, "/", tempNAME, ".", Today, ".",VARIANT,".",tempSTART,".",tempEND,".regional_assoc.pdf"), plot = p1)
  # ggsave(filename = paste0(RACER_loc, "/", tempNAME, ".", Today, ".",VARIANT,".",tempSTART,".",tempEND,".regional_assoc.eps"), plot = p1)

  # print(ggplotly(p1))
  rm(temp, p1,
     temp_f,
     tempCHR, tempSTART, tempEND,
     VARIANT, tempNAME)
}
Getting data for rs9633535.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.

Plotting region surrounding rs9633535 on 10:63584853-63921073.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Collecting posterior probabilities
Generating Plot
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
Saving image for rs9633535.
Getting data for rs2854746.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.

Plotting region surrounding rs2854746 on 7:45894617-46054070.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Collecting posterior probabilities
Generating Plot
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
Saving image for rs2854746.
Getting data for rs3844006.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...

Getting LD data.

Plotting region surrounding rs3844006 on 6:131937915-132289374.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Collecting posterior probabilities
Generating Plot
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
Saving image for rs3844006.

Regional association plots in African-American

Note here that we plot the region, and not based on the lead variant of the EA-AA analyses.

library(RACER)
# Make directory for plots
ifelse(!dir.exists(file.path(PROJECT_loc, "/RACER_AA")), 
       dir.create(file.path(PROJECT_loc, "/RACER_AA")), 
       FALSE)
[1] FALSE
RACER_AA_loc = paste0(PROJECT_loc,"/RACER_AA")

variants_of_interest <- c(variant_list$rsID)

variants_of_interest_fewgenes <- c("rs9349379", 
                                   "rs3844006", # throws an error which I don't understand immediately - could be that the variant is not present in AA 1000G data
                                   "rs2854746", "rs4977575", 
                                   "rs10899970",
                                   "rs9633535", # this one throws an LD error
                                   "rs10762577",
                                   "rs11063120", "rs9515203", "rs7182103",
                                   "rs7412")

for(VARIANT in variants_of_interest){
  cat(paste0("Getting data for ", VARIANT,".\n"))

  tempCHR <- subset(variant_list, rsID == VARIANT)[,5]
  tempSTART <- subset(variant_list, rsID == VARIANT)[,17]
  tempEND <- subset(variant_list, rsID == VARIANT)[,18]
  tempVARIANTnr <- subset(variant_list, rsID == VARIANT)[,1]

  cat("\nSubset required data.\n")
  temp <- subset(gwas_sumstats_racer_AA, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))

  cat("\nFormatting association data.\n")
  temp_f = RACER::formatRACER(assoc_data = temp, chr_col = 3, pos_col = 4, p_col = 5)
  
  # cat("\nGetting LD data.\n")
  temp_f_ld = RACER::ldRACER(assoc_data = temp_f, rs_col = 2, pops = "AFR", lead_snp = VARIANT)

  cat(paste0("\nPlotting region surrounding ", VARIANT," on ",tempCHR,":",tempSTART,"-",tempEND,".\n"))

  p1 <- singlePlotRACER2(assoc_data = temp_f, 
                         chr = tempCHR, build = "hg19", 
                         plotby = "coord", snp_plot = VARIANT,
                         start_plot = tempSTART, end_plot = tempEND,
                         label_lead = FALSE, gene_track_h = 2, gene_name_s = 1.75)
  
  print(p1)
  cat(paste0("Saving image for ", VARIANT,".\n"))
  ggsave(filename = paste0(RACER_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.AA.png"), plot = last_plot())
  ggsave(filename = paste0(RACER_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.AA.pdf"), plot = last_plot())
  ggsave(filename = paste0(RACER_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_assoc.AA.eps"), plot = last_plot())

  rm(temp, p1,
     temp_f, temp_f_ld,
     tempCHR, tempSTART, tempEND,
     VARIANT, tempVARIANTnr)
  
}
Getting data for rs9349379.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9349379...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9349379&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [16%] Downloaded 15980 bytes...
 [33%] Downloaded 32210 bytes...
 [50%] Downloaded 48576 bytes...
 [100%] Downloaded 95751 bytes...
Merging input association data with LD...

Plotting region surrounding rs9349379 on 6:12403957-13403957.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs9349379.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs3844006.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs3844006...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs3844006&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 72560 bytes...
Merging input association data with LD...

Plotting region surrounding rs3844006 on 6:131595002-132595002.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs3844006.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs2854746.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs2854746...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs2854746&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [22%] Downloaded 15980 bytes...
 [100%] Downloaded 71651 bytes...
Merging input association data with LD...

Plotting region surrounding rs2854746 on 7:45460645-46460645.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs2854746.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs4977575.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs4977575...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs4977575&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [17%] Downloaded 15980 bytes...
 [100%] Downloaded 93249 bytes...
Merging input association data with LD...

Plotting region surrounding rs4977575 on 9:21624744-22624744.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs4977575.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs10899970.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10899970...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10899970&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [35%] Downloaded 64977 bytes...
 [61%] Downloaded 114688 bytes...
 [70%] Downloaded 131054 bytes...
 [79%] Downloaded 147456 bytes...
 [100%] Downloaded 185291 bytes...
Merging input association data with LD...

Plotting region surrounding rs10899970 on 10:44015716-45334720.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs10899970.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs9633535.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9633535...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9633535&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 42221 bytes...
Merging input association data with LD...

Plotting region surrounding rs9633535 on 10:63336088-64336088.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs9633535.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs10762577.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10762577...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10762577&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [78%] Downloaded 114111 bytes...
 [90%] Downloaded 130513 bytes...
 [100%] Downloaded 144558 bytes...
Merging input association data with LD...

Plotting region surrounding rs10762577 on 10:75417431-76417431.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs10762577.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs11063120.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs11063120...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs11063120&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 46036 bytes...
Merging input association data with LD...

Plotting region surrounding rs11063120 on 12:3986618-4986618.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs11063120.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs9515203.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9515203...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9515203&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 41921 bytes...
Merging input association data with LD...

Plotting region surrounding rs9515203 on 13:110549623-111549623.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs9515203.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs7182103.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7182103...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7182103&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [72%] Downloaded 81343 bytes...
 [87%] Downloaded 97745 bytes...
 [100%] Downloaded 111697 bytes...
Merging input association data with LD...

Plotting region surrounding rs7182103 on 15:78623946-79623946.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs7182103.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs7412.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7412...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7412&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [48%] Downloaded 15980 bytes...
 [100%] Downloaded 33190 bytes...
Merging input association data with LD...

Plotting region surrounding rs7412 on 19:44912079-45912079.
Association Data Set is missing LD data, the resulting plot won't have LD information, but you can add it using the ldRACER.R function.
Plotting by...
coord
Reading in association data
Generating Plot
Saving image for rs7412.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image

Approximate Bayes Factor colocalisation analyses

The idea behind the Approximate Bayes Factor (ABF) analysis is that the association of each trait with SNPs in a region may be summarised by a vector of 0s and at most a single 1, with the 1 indicating the causal SNP (so, assuming a single causal SNP for each trait).

The posterior probability of each possible configuration can be calculated and so, crucially, can the posterior probabilities that the traits share their configurations. This allows us to estimate the support for the following cases, i.e. hypotheses:

𝐻0: neither trait has a genetic association in the region 𝐻1: only trait 1 has a genetic association in the region 𝐻2: only trait 2 has a genetic association in the region 𝐻3: both traits are associated, but with different causal variants 𝐻4: both traits are associated and share a single causal variant

To what extent do the loci between European and African-American ancestries overlap? We are working on the assumption that the 11 loci are the loci and will test whether these overlap, i.e. colocalize.

Preparation

Let’s make sure we have remotes and coloc installed.

if(!require("remotes"))
   install.packages("remotes") # if necessary
library(remotes)
install_github("chr1swallace/coloc@main",
               build_vignettes = TRUE)
Using github PAT from envvar GITHUB_PAT
Skipping install of 'coloc' from a github remote, the SHA1 (0b0701a5) has not changed since last install.
  Use `force = TRUE` to force installation
library(coloc)
This is coloc version 5.2.0

Visualization

We can create mirror and scatter plot for each region.


library(RACER)
# Make directory for plots
ifelse(!dir.exists(file.path(PROJECT_loc, "/RACER_EA_vs_AA")), 
       dir.create(file.path(PROJECT_loc, "/RACER_EA_vs_AA")), 
       FALSE)
[1] FALSE
RACER_EA_vs_AA_loc = paste0(PROJECT_loc,"/RACER_EA_vs_AA")

variants_of_interest <- c(variant_list$rsID)

# variants_of_interest_fewgenes <- c("rs9349379", 
#                                    "rs3844006", # throws an error which I don't understand immediately - could be that the variant is not present in AA 1000G data
#                                    "rs2854746", "rs4977575", 
#                                    "rs10899970",
#                                    "rs9633535", 
#                                    "rs10762577",
#                                    "rs11063120", "rs9515203", "rs7182103",
#                                    "rs7412")
variants_of_interest_fewgenes <- c("rs10762577",
                                   "rs11063120", "rs9515203", "rs7182103",
                                   "rs7412")
for(VARIANT in variants_of_interest){
  cat(paste0("Getting data for ", VARIANT,".\n"))

  tempCHR <- subset(variant_list, rsID == VARIANT)[,5]
  tempSTART <- subset(variant_list, rsID == VARIANT)[,17]
  tempEND <- subset(variant_list, rsID == VARIANT)[,18]
  tempVARIANTnr <- subset(variant_list, rsID == VARIANT)[,1]

  cat("\nSubset required data.\n")
  temp1 <- subset(gwas_sumstats_racer_EA, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))
  temp2 <- subset(gwas_sumstats_racer_AA, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))

  cat("\nFormatting association data.\n")
  temp_f1 = RACER::formatRACER(assoc_data = temp1, chr_col = 3, pos_col = 4, p_col = 5)
  temp_f2 = RACER::formatRACER(assoc_data = temp2, chr_col = 3, pos_col = 4, p_col = 5)
  
  # cat("\nGetting LD data.\n")
  temp_f_ld1 = RACER::ldRACER(assoc_data = temp_f1, rs_col = 2, pops = "EUR", lead_snp = VARIANT)
  temp_f_ld2 = RACER::ldRACER(assoc_data = temp_f2, rs_col = 2, pops = "AFR", lead_snp = VARIANT)

  cat(paste0("\nPlotting region surrounding ", VARIANT," on ",tempCHR,":",tempSTART,"-",tempEND,".\n"))

  p1 <- mirrorPlotRACER(assoc_data1 = temp_f_ld1, 
                        assoc_data2 = temp_f_ld2, 
                        chr = tempCHR, 
                        name1 = "European ancestry", 
                         name2 = "African-American ancestry", 
                        plotby = "coord", 
                        start_plot = tempSTART, end_plot = tempEND)
  
  print(p1)
  
  p2 <- scatterPlotRACER(assoc_data1 = temp_f_ld1, 
                         assoc_data2 = temp_f_ld2, 
                         chr = tempCHR, 
                         name1 = "European ancestry", 
                         name2 = "African-American ancestry", 
                         region_start = tempSTART, 
                         region_end = tempEND, 
                         ld_df = 1)
  
  print(p2)
  
  cat(paste0("Saving image for ", VARIANT,".\n"))
  ggsave(filename = paste0(RACER_EA_vs_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_mirror.EA_vs_AA.png"), plot = p1)
  ggsave(filename = paste0(RACER_EA_vs_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_mirror.EA_vs_AA.pdf"), plot = p1)
  ggsave(filename = paste0(RACER_EA_vs_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_mirror.EA_vs_AA.eps"), plot = p1)

  cat(paste0("Saving image for ", VARIANT,".\n"))
  ggsave(filename = paste0(RACER_EA_vs_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_scatter.EA_vs_AA.png"), plot = p2)
  ggsave(filename = paste0(RACER_EA_vs_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_scatter.EA_vs_AA.pdf"), plot = p2)
  ggsave(filename = paste0(RACER_EA_vs_AA_loc, "/", tempVARIANTnr, ".", Today, ".",VARIANT,".regional_scatter.EA_vs_AA.eps"), plot = p2)

  
  rm(temp1, temp2,
     p1,p2,
     temp_f1, temp_f_ld1,
     temp_f2, temp_f_ld2,
     tempCHR, tempSTART, tempEND,
     VARIANT, tempVARIANTnr)
  
}
Getting data for rs9349379.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9349379...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9349379&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 70967 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9349379...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9349379&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [50%] Downloaded 48576 bytes...
 [57%] Downloaded 55496 bytes...
 [100%] Downloaded 95751 bytes...
Merging input association data with LD...

Plotting region surrounding rs9349379 on 6:12403957-13403957.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs9349379.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs9349379.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs3844006.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs3844006...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs3844006&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 31016 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs3844006...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs3844006&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 72560 bytes...
Merging input association data with LD...

Plotting region surrounding rs3844006 on 6:131595002-132595002.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs3844006.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs3844006.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs2854746.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs2854746...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs2854746&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [80%] Downloaded 88263 bytes...
 [95%] Downloaded 104629 bytes...
 [100%] Downloaded 109298 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs2854746...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs2854746&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 71651 bytes...
Merging input association data with LD...

Plotting region surrounding rs2854746 on 7:45460645-46460645.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs2854746.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs2854746.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs4977575.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs4977575...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs4977575&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 26000 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs4977575...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs4977575&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [59%] Downloaded 55496 bytes...
 [94%] Downloaded 88264 bytes...
 [100%] Downloaded 93249 bytes...
Merging input association data with LD...

Plotting region surrounding rs4977575 on 9:21624744-22624744.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs4977575.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs4977575.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs10899970.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10899970...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10899970&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [51%] Downloaded 81920 bytes...
 [61%] Downloaded 98286 bytes...
 [71%] Downloaded 114688 bytes...
 [81%] Downloaded 131054 bytes...
 [100%] Downloaded 160476 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10899970...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10899970&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [8%] Downloaded 15979 bytes...
 [30%] Downloaded 57344 bytes...
 [39%] Downloaded 73710 bytes...
 [75%] Downloaded 139246 bytes...
 [84%] Downloaded 155648 bytes...
 [100%] Downloaded 185291 bytes...
Merging input association data with LD...

Plotting region surrounding rs10899970 on 10:44015716-45334720.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs10899970.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs10899970.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs9633535.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9633535...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9633535&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 49363 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9633535...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9633535&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 42221 bytes...
Merging input association data with LD...

Plotting region surrounding rs9633535 on 10:63336088-64336088.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs9633535.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs9633535.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs10762577.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10762577...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10762577&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 92997 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs10762577...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs10762577&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [56%] Downloaded 81920 bytes...
 [100%] Downloaded 144558 bytes...
Merging input association data with LD...

Plotting region surrounding rs10762577 on 10:75417431-76417431.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs10762577.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs10762577.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs11063120.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs11063120...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs11063120&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 41883 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs11063120...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs11063120&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 46036 bytes...
Merging input association data with LD...

Plotting region surrounding rs11063120 on 12:3986618-4986618.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs11063120.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs11063120.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs9515203.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9515203...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9515203&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 30139 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs9515203...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs9515203&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 41921 bytes...
Merging input association data with LD...

Plotting region surrounding rs9515203 on 13:110549623-111549623.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs9515203.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs9515203.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs7182103.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7182103...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7182103&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [55%] Downloaded 65518 bytes...
 [83%] Downloaded 98286 bytes...
 [100%] Downloaded 118299 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7182103...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7182103&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [64%] Downloaded 71861 bytes...
 [79%] Downloaded 88263 bytes...
 [100%] Downloaded 111697 bytes...
Merging input association data with LD...

Plotting region surrounding rs7182103 on 15:78623946-79623946.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Reading in association data
Generating plot.
Saving image for rs7182103.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs7182103.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Getting data for rs7412.

Subset required data.

Formatting association data.
Formating association data...
Processing -log10(p-values)...
Preparing association data...
Formating association data...
Processing -log10(p-values)...
Preparing association data...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7412...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7412&pop=EUR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 38865 bytes...
Merging input association data with LD...
All inputs are go!
Reading in association data...
Populations selected.
Calculating LD using rs7412...
[1] "https://ldlink.nci.nih.gov/LDlinkRest/ldproxy?var=rs7412&pop=AFR&r2_d=r2&token=c0f613f149ab"

 [100%] Downloaded 33190 bytes...
Merging input association data with LD...

Plotting region surrounding rs7412 on 19:44912079-45912079.
Plotting by...
coord
Reading in association data
Generating plot.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
Warning: Removed 1 row(s) containing missing values (geom_path).
Warning: Removed 1 rows containing missing values (geom_text).
Reading in association data
Generating plot.
Saving image for rs7412.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving image for rs7412.
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image

Quantify colocalization

We want to quantify the overlap.

Setting up an output directory for coloc.

ifelse(!dir.exists(file.path(PROJECT_loc, "/COLOC_EA_vs_AA")), 
       dir.create(file.path(PROJECT_loc, "/COLOC_EA_vs_AA")), 
       FALSE)
[1] FALSE
COLOC_EA_vs_AA_loc = paste0(PROJECT_loc,"/COLOC_EA_vs_AA")

Data colleaction

Preparing data for coloc: we require beta and standard errors for coloc.

First the European ancestry data, next the African-American ancestry data.

gwas_sumstats_EA <- fread(paste0(GWAS_loc,"/CAC1000G_EA_FINAL_FUMA.txt.gz"),
                         showProgress = TRUE)
|--------------------------------------------------|
|==================================================|
names(gwas_sumstats_EA)[names(gwas_sumstats_EA) == "Pos"] <- "Position"

gwas_sumstats_racer_EA <- subset(gwas_sumstats_EA,
                              select = c("MarkerName", "rsID", "Chr", "Position", 
                                         "Effect", "StdErr",
                                         "Pvalue",
                                         "N"))
rm(gwas_sumstats_EA)
gwas_sumstats_AA <- fread(paste0(GWAS_loc,"/CAC1000G_AA_FINAL_FUMA.filtered.txt.gz"),
                         showProgress = TRUE)
|--------------------------------------------------|
|==================================================|
names(gwas_sumstats_AA)[names(gwas_sumstats_AA) == "Pos"] <- "Position"

gwas_sumstats_racer_AA <- subset(gwas_sumstats_AA,
                              select = c("MarkerName", "rsID", "Chr", "Position", 
                                         "Effect", "StdErr",
                                         "Pvalue",
                                         "N"))
Error in `[.data.table`(x, r, vars, with = FALSE) : 
  column(s) not found: StdErr

Colocalization

Now we are reading to formally test the colocalization per trait. Note that trait 1 = European ancestry; trait 2 = African-American ancestry.

for(VARIANT in variants_of_interest){
  cat(paste0("Getting data for ", VARIANT,".\n"))

  tempCHR <- subset(variant_list, rsID == VARIANT)[,5]
  tempSTART <- subset(variant_list, rsID == VARIANT)[,17]
  tempEND <- subset(variant_list, rsID == VARIANT)[,18]
  tempVARIANTnr <- subset(variant_list, rsID == VARIANT)[,1]

  cat("\nSubset required data.\n")
  temp1 <- subset(gwas_sumstats_racer_EA, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))
  temp2 <- subset(gwas_sumstats_racer_AA, Chr == tempCHR & (Position >= tempSTART & Position <= tempEND))

  cat("\nCheck temp1 data.\n")
  temp1 <- rename_with(temp1, tolower)
  
  # correcting column names
  temp1 <- rename(temp1, beta = effect)
  temp1 <- rename(temp1, se = stderr)
  temp1 <- rename(temp1, snp = rsid)
  
  # calculating things
  temp1$varbeta <- temp1$se^2
  
  temp1 <- as.list(temp1) # critical, as coloc expects a list of variables
  
  temp1$type <- "quant"
  temp1$sdY <- 1

  coloc::check_dataset(temp1, warn.minp = 1e-10)
  
  cat("\nCheck temp2 data.\n")
  temp2 <- rename_with(temp2, tolower)
  
  # correcting column names
  temp2 <- rename(temp2, beta = effect)
  temp2 <- rename(temp2, se = stderr)
  temp2 <- rename(temp2, snp = rsid)
  
  # calculating things
  temp2$varbeta <- temp2$se^2
  
  temp2 <- as.list(temp2) # critical, as coloc expects a list of variables
  
  temp2$type <- "quant"
  temp2$sdY <- 1

  coloc::check_dataset(temp2, warn.minp = 1e-10)
  
  cat("\nPlot required data.\n")
  plot_dataset(temp1)
  plot_dataset(temp2)

  res_temp1_vs_temp2_single <- coloc.abf(dataset1 = temp1, 
                                         dataset2 = temp2)

  cat("\nColocalization.\n")
  print(res_temp1_vs_temp2_single)
  write_lines(res_temp1_vs_temp2_single, file = paste0(COLOC_EA_vs_AA_loc, "/res_EA_vs_AA_single.",
                                                       tempVARIANTnr,".",tempCHR,"_",tempSTART,"_",tempEND,".txt"))

  coloc::sensitivity(res_temp1_vs_temp2_single, "H4 > 0.9")
  
  # Step 1: Call the pdf command to start the plot
  pdf(file = paste0(COLOC_EA_vs_AA_loc, "/res_EA_vs_AA_single.",
                    tempVARIANTnr,".",tempCHR,"_",tempSTART,"_",tempEND,".pdf"))   # The directory you want to save the file in
  # Step 2: Create the plot with R code
  coloc::sensitivity(res_temp1_vs_temp2_single, "H4 > 0.9")

  # Step 3: Run dev.off() to create the file!
  dev.off()
  
  rm(temp1, temp2,
     # p1,p2,
     # temp_f1, temp_f_ld1,
     # temp_f2, temp_f_ld2,
     tempCHR, tempSTART, tempEND,
     VARIANT, tempVARIANTnr)
  
}
Getting data for rs9349379.

Subset required data.

Check temp1 data.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 0.0010709
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 0.0010709
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
 2.64e-21  4.40e-01  1.86e-22  3.04e-02  5.30e-01 
[1] "PP abf for shared variant: 53%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2         H3      H4
 0.7610836 0.1082 0.1082 0.01169642 0.01082

Posterior
       nsnps           H0           H1           H2           H3           H4 
1.082000e+03 2.643499e-21 4.401108e-01 1.857062e-22 3.038835e-02 5.295009e-01 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs3844006.

Subset required data.

Check temp1 data.
Warning in coloc::check_dataset(temp1, warn.minp = 1e-10) :
  minimum p value is: 3.5548e-06
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 9.5528e-05
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset1, 1) :
  minimum p value is: 3.5548e-06
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 9.5528e-05
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
  0.21300   0.06910   0.02150   0.00628   0.69000 
[1] "PP abf for shared variant: 69%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2        H3      H4
 0.8049601 0.0891 0.0891 0.0079299 0.00891

Posterior
       nsnps           H0           H1           H2           H3           H4 
8.910000e+02 2.127262e-01 6.907437e-02 2.147238e-02 6.281855e-03 6.904452e-01 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs2854746.

Subset required data.

Check temp1 data.
Warning in coloc::check_dataset(temp1, warn.minp = 1e-10) :
  minimum p value is: 1.7731e-07
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 0.00072736
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 0.00072736
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
   0.5990    0.1080    0.0686    0.0122    0.2120 
[1] "PP abf for shared variant: 21.2%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2         H3      H4
 0.7459854 0.1147 0.1147 0.01314462 0.01147

Posterior
       nsnps           H0           H1           H2           H3           H4 
1.147000e+03 5.987696e-01 1.080300e-01 6.855817e-02 1.215678e-02 2.124855e-01 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs4977575.

Subset required data.

Check temp1 data.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 0.00077724
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 0.00077724
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
 3.82e-38  4.04e-01  3.70e-39  3.86e-02  5.58e-01 
[1] "PP abf for shared variant: 55.8%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2        H3      H4
 0.7394555 0.1175 0.1175 0.0137945 0.01175

Posterior
       nsnps           H0           H1           H2           H3           H4 
1.175000e+03 3.819485e-38 4.037077e-01 3.703500e-39 3.858714e-02 5.577051e-01 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs10899970.

Subset required data.

Check temp1 data.
Warning in coloc::check_dataset(temp1, warn.minp = 1e-10) :
  minimum p value is: 5.4509e-09
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 0.00014931
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 0.00014931
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
 0.001320  0.848000  0.000167  0.107000  0.043600 
[1] "PP abf for shared variant: 4.36%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2        H3      H4
 0.6284776 0.1641 0.1641 0.0269124 0.01641

Posterior
       nsnps           H0           H1           H2           H3           H4 
1.641000e+03 1.319568e-03 8.476892e-01 1.669259e-04 1.071894e-01 4.363490e-02 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs9633535.

Subset required data.

Check temp1 data.
Warning in coloc::check_dataset(temp1, warn.minp = 1e-10) :
  minimum p value is: 3.7901e-07
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 1.7844e-05
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 1.7844e-05
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
   0.1540    0.5240    0.0155    0.0527    0.2540 
[1] "PP abf for shared variant: 25.4%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0    H1    H2        H3     H4
 0.8188193 0.083 0.083 0.0068807 0.0083

Posterior
       nsnps           H0           H1           H2           H3           H4 
830.00000000   0.15368622   0.52399743   0.01553863   0.05272534   0.25405239 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs10762577.

Subset required data.

Check temp1 data.
Warning in coloc::check_dataset(temp1, warn.minp = 1e-10) :
  minimum p value is: 1.2432e-06
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 0.00073363
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset1, 1) :
  minimum p value is: 1.2432e-06
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 0.00073363
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
  0.06080   0.85200   0.00167   0.02340   0.06210 
[1] "PP abf for shared variant: 6.21%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2         H3      H4
 0.9440809 0.0263 0.0263 0.00068906 0.00263

Posterior
       nsnps           H0           H1           H2           H3           H4 
2.630000e+02 6.077064e-02 8.521307e-01 1.669798e-03 2.335196e-02 6.207694e-02 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs11063120.

Subset required data.

Check temp1 data.
Warning in coloc::check_dataset(temp1, warn.minp = 1e-10) :
  minimum p value is: 9.1265e-09
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 3.7022e-05
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 3.7022e-05
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
  0.00446   0.70700   0.00105   0.16600   0.12200 
[1] "PP abf for shared variant: 12.2%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2        H3      H4
 0.7992586 0.0916 0.0916 0.0083814 0.00916

Posterior
       nsnps           H0           H1           H2           H3           H4 
9.160000e+02 4.464724e-03 7.069361e-01 1.047960e-03 1.658103e-01 1.217409e-01 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs9515203.

Subset required data.

Check temp1 data.
Warning in coloc::check_dataset(temp1, warn.minp = 1e-10) :
  minimum p value is: 3.1936e-07
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 0.0005347
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 0.0005347
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
   0.1080    0.7390    0.0142    0.0972    0.0417 
[1] "PP abf for shared variant: 4.17%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
       H0     H1     H2       H3      H4
 0.686176 0.1401 0.1401 0.019614 0.01401

Posterior
       nsnps           H0           H1           H2           H3           H4 
1.401000e+03 1.078718e-01 7.390042e-01 1.419994e-02 9.723877e-02 4.168536e-02 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs7182103.

Subset required data.

Check temp1 data.
Warning in coloc::check_dataset(temp1, warn.minp = 1e-10) :
  minimum p value is: 1.9223e-09
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 5.9197e-06
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 5.9197e-06
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
 9.93e-05  8.11e-01  1.82e-05  1.49e-01  3.97e-02 
[1] "PP abf for shared variant: 3.97%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2         H3      H4
 0.7836873 0.0984 0.0984 0.00967272 0.00984

Posterior
       nsnps           H0           H1           H2           H3           H4 
9.840000e+02 9.928622e-05 8.113958e-01 1.820615e-05 1.487462e-01 3.974052e-02 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9
Getting data for rs7412.

Subset required data.

Check temp1 data.

Check temp2 data.
Warning in coloc::check_dataset(temp2, warn.minp = 1e-10) :
  minimum p value is: 2.9412e-06
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.

Plot required data.

Warning in check_dataset(d = dataset2, 2) :
  minimum p value is: 2.9412e-06
If this is what you expected, this is not a problem.
If this is not as small as you expected, please check the 02_data vignette.
PP.H0.abf PP.H1.abf PP.H2.abf PP.H3.abf PP.H4.abf 
  0.01090   0.64900   0.00402   0.23800   0.09770 
[1] "PP abf for shared variant: 9.77%"

Colocalization.
Coloc analysis of trait 1, trait 2

SNP Priors
   p1    p2   p12 
1e-04 1e-04 1e-05 

Hypothesis Priors
        H0     H1     H2         H3      H4
 0.7896519 0.0958 0.0958 0.00916806 0.00958

Posterior
       nsnps           H0           H1           H2           H3           H4 
9.580000e+02 1.094517e-02 6.491241e-01 4.018346e-03 2.382180e-01 9.769439e-02 
Results fail decision rule H4 > 0.9

Results fail decision rule H4 > 0.9

Summary colocalization

ENPP1/ENPP3 locus

File: res_EA_vs_AA_single.1.6_131595002_132595002.txt

c(nsnps = 891, PP.H0.abf = 0.212726180436945, PP.H1.abf = 0.0690743673677815, PP.H2.abf = 0.0214723764600455, PP.H3.abf = 0.00628185511784578, PP.H4.abf = 0.690445220617383)

Conclusion: 69.0% probability that the locus is shared between both ancestries and includes the same causal variant.

IGFBP3 locus

File: res_EA_vs_AA_single.2.7_45460645_46460645.txt

c(nsnps = 1147, PP.H0.abf = 0.598769555553722, PP.H1.abf = 0.108030020950978, PP.H2.abf = 0.0685581712636257, PP.H3.abf = 0.0121567818199419, PP.H4.abf = 0.212485470411732)

Conclusion: 59.9% probability that the locus is not associated in either ancestry, but 10.8 that it is European-specific, and 21.2% that it is shared between both ancestries and includes the same causal variant.

CXCL12 locus

File: res_EA_vs_AA_single.3.10_44015716_45334720.txt

c(nsnps = 1641, PP.H0.abf = 0.00131956785769608, PP.H1.abf = 0.847689205708678, PP.H2.abf = 0.000166925872986017, PP.H3.abf = 0.107189395862512, PP.H4.abf = 0.0436349046981281)

Conclusion: 84.8% probability that the locus is European-specific, but 4.3-10.7% probability that the locus is shared between both ancestries.

ARID5B locus

File: res_EA_vs_AA_single.4.10_63336088_64336088.txt

c(nsnps = 830, PP.H0.abf = 0.153686217856268, PP.H1.abf = 0.52399742579072, PP.H2.abf = 0.0155386299541433, PP.H3.abf = 0.0527253377600635, PP.H4.abf = 0.254052388638805)

Conclusion: 52.4% probability that the locus is European-specific, but 25.4% probability that the locus is shared between both ancestries and includes different causal variants.

ADK locus

File: res_EA_vs_AA_single.5.10_75417431_76417431.txt

c(nsnps = 263, PP.H0.abf = 0.0607706367611815, PP.H1.abf = 0.85213066483438, PP.H2.abf = 0.00166979761323014, PP.H3.abf = 0.0233519569734565, PP.H4.abf = 0.0620769438177522)

Conclusion: 85.2% probability that the locus is European-specific, but 2.3-6.2% probability that the locus is shared between both ancestries.

FGF23 locus

File: res_EA_vs_AA_single.6.12_3986618_4986618.txt

c(nsnps = 916, PP.H0.abf = 0.00446472426354749, PP.H1.abf = 0.706936091086602, PP.H2.abf = 0.00104796032447378, PP.H3.abf = 0.165810337258493, PP.H4.abf = 0.121740887066883)

Conclusion: 70.7% probability that the locus is European-specific, but 12.2-16.6% probability that the locus is shared between both ancestries.

COL4A1/COL4A2 locus

File: res_EA_vs_AA_single.7.13_110549623_111549623.txt

c(nsnps = 1401, PP.H0.abf = 0.10787176608552, PP.H1.abf = 0.739004164794562, PP.H2.abf = 0.0141999398787617, PP.H3.abf = 0.0972387717170162, PP.H4.abf = 0.0416853575241402)

Conclusion: 73.9% probability that the locus is European-specific, but 4.1-9.7% probability that the locus is shared between both ancestries.

MORF4L locus

File: res_EA_vs_AA_single.8.15_78623946_79623946.txt

c(nsnps = 984, PP.H0.abf = 9.92862156724414e-05, PP.H1.abf = 0.811395804353311, PP.H2.abf = 1.82061468585998e-05, PP.H3.abf = 0.148746181818894, PP.H4.abf = 0.0397405214652622)

Conclusion: 81.1% probability that the locus is European-specific, but 14.9% probability that the locus is shared between both ancestries and includes different causal variants.

PHACTR1 locus

File: res_EA_vs_AA_single.9.6_12403957_13403957.txt

c(nsnps = 1082, PP.H0.abf = 2.64349916808974e-21, PP.H1.abf = 0.440110764390371, PP.H2.abf = 1.85706249346447e-22, PP.H3.abf = 0.0303883523691947, PP.H4.abf = 0.529500883240437)

Conclusion: 44.0% probability that the locus is European-specific, but 52.9% probability that the locus is shared between both ancestries and includes the same causal variant.

CDKN2A/CDKN2B locus

File: res_EA_vs_AA_single.10.9_21624744_22624744.txt

c(nsnps = 1175, PP.H0.abf = 3.8194848005248e-38, PP.H1.abf = 0.40370772152903, PP.H2.abf = 3.70349960775562e-39, PP.H3.abf = 0.0385871394254695, PP.H4.abf = 0.557705139045494)

Conclusion: 40.4% probability that the locus is European-specific, but 55.8% probability that the locus is shared between both ancestries and includes the same causal variant.

APOE locus

File: res_EA_vs_AA_single.11.19_44912079_45912079.txt

c(nsnps = 958, PP.H0.abf = 0.0109451663563229, PP.H1.abf = 0.649124092491782, PP.H2.abf = 0.00401834569685491, PP.H3.abf = 0.238218007619045, PP.H4.abf = 0.0976943878359947)

Conclusion: 64.9% probability that the locus is European-specific, but 23.8% probability that the locus is shared between both ancestries and includes different causal variants.

Overarching conclusions:

  1. The European-specific analysis is better powered than the African-American-specific analysis
  2. Taking into account the issues of power, it is more likely that the majority of loci are shared between ancestries. The ADK and COL4A1/COL4A2 loci are the least shared between ancestries, and both analyses are well-_under_powered for the IGFBP3 locus.
  3. Given sufficient and more equal sample sizes between ancestries more firm conclusions could be drawn, but applying Occam’s razor it is more likely that these loci are shared between ancestries than not.

Session information


Version:      v1.4.2
Last update:  2022-06-28
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to create plot regional association plots.
Minimum requirements: R version 3.4.3 (2017-06-30) -- 'Single Candle', Mac OS X El Capitan

Changes log
* v1.4.2 Added formal quantification of colocalization between ancestries.
* v1.4.1 Added mirror plots and scatter plots.
* v1.4.0 Update with AA data.
* v1.3.0 Added the credible sets to the aditional regions.
* v1.2.0 Added in aditional regions.
* v1.1.0 Created PNG and PDF of top loci regions.
* v1.0.0 Initial version. 

sessionInfo()

Saving environment

save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".RegionalAssociationPlots.RData"))
© 1979-2022 Sander W. van der Laan | s.w.vanderlaan[at]gmail.com | swvanderlaan.github.io.
LS0tCnRpdGxlOiAiUmVnaW9uYWwgYXNzb2NpYXRpb24gcGxvdHRpbmcgb2YgMTEgbG9jaSBhc3NvY2lhdGVkIHdpdGggQ0FDLiIKYXV0aG9yOiAiW1NhbmRlciBXLiB2YW4gZGVyIExhYW4sIFBoRF0oaHR0cHM6Ly9zd3ZhbmRlcmxhYW4uZ2l0aHViLmlvKSB8IEBzd3ZhbmRlcmxhYW4gfCBzLncudmFuZGVybGFhbkBnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjYWNoZTogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvbGxhcHNlOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnLmFsaWduOiBjZW50ZXIKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGZpZ19oZWlnaHQ6IDYKICAgIGZpZ19yZXRpbmE6IDIKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgdGhlbWU6IGx1bWVuCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IG5vCiAgICAgIHNtb290aF9zY3JvbGw6IHllcwptYWluZm9udDogQXJpYWwKc3VidGl0bGU6ICJBICdkcnVnZ2FibGUtTUktdGFyZ2V0cycgcHJvamVjdCIKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCiMgU2V0dXAKV2Ugd2lsbCBjbGVhbiB0aGUgZW52aXJvbm1lbnQsIHNldHVwIHRoZSBsb2NhdGlvbnMsIGRlZmluZSBjb2xvcnMsIGFuZCBjcmVhdGUgYSBkYXRlc3RhbXAuCgpfQ2xlYW4gdGhlIGVudmlyb25tZW50Ll8KYGBge3IgZWNobyA9IEZBTFNFfQojIHJtKGxpc3QgPSBscygpKQoKYGBgCgpfU2V0IGxvY2F0aW9ucyBhbmQgd29ya2luZyBkaXJlY3Rvcmllcy4uLl8KYGBge3IgTG9jYWxTeXN0ZW0sIGVjaG8gPSBGQUxTRX0Kc291cmNlKCJzY3JpcHRzL2xvY2FsLnN5c3RlbS5SIikKCmBgYAoKXy4uLiBhIHBhY2thZ2UtaW5zdGFsbGF0aW9uIGZ1bmN0aW9uIC4uLl8KYGBge3J9CnNvdXJjZSgic2NyaXB0cy9mdW5jdGlvbnMuUiIpCmBgYAoKCl8uLi4gYW5kIGxvYWQgdGhvc2UgcGFja2FnZXMuXwpgYGB7ciBsb2FkaW5nX3BhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzb3VyY2UoInNjcmlwdHMvcGFja2FnZXMwNS5SIikKCmBgYAoKX1dlIHdpbGwgY3JlYXRlIGEgZGF0ZXN0YW1wIGFuZCBkZWZpbmUgdGhlIFV0cmVjaHQgU2NpZW5jZSBQYXJrIENvbG91ciBTY2hlbWVfLgpgYGB7ciBTZXR0aW5nOiBDb2xvcnN9CgpUb2RheSA9IGZvcm1hdChhcy5EYXRlKGFzLlBPU0lYbHQoU3lzLnRpbWUoKSkpLCAiJVklbSVkIikKVG9kYXkuUmVwb3J0ID0gZm9ybWF0KGFzLkRhdGUoYXMuUE9TSVhsdChTeXMudGltZSgpKSksICIlQSwgJUIgJWQsICVZIikKCnNvdXJjZSgic2NyaXB0cy9jb2xvcnMuUiIpCgpgYGAKCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CiMgZnVydGhlciBkZWZpbmUgc29tZSBrbml0ci1vcHRpb25zLgprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4LCBmaWcucGF0aCA9ICdGaWd1cmVzLycsIAogICAgICAgICAgICAgICAgICAgICAgd3dhcm5pbmcgPSBUUlVFLCAjIHNob3cgd2FybmluZ3MgZHVyaW5nIGNvZGVib29rIGdlbmVyYXRpb24KICBtZXNzYWdlID0gVFJVRSwgIyBzaG93IG1lc3NhZ2VzIGR1cmluZyBjb2RlYm9vayBnZW5lcmF0aW9uCiAgZXJyb3IgPSBUUlVFLCAjIGRvIG5vdCBpbnRlcnJ1cHQgY29kZWJvb2sgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIGVycm9ycywKICAgICAgICAgICAgICAgICMgdXN1YWxseSBiZXR0ZXIgZm9yIGRlYnVnZ2luZwogIGVjaG8gPSBUUlVFLCAgIyBzaG93IFIgY29kZQogICAgICAgICAgICAgICAgICAgICAgZXZhbCA9IFRSVUUpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCnBhbmRlcjo6cGFuZGVyT3B0aW9ucygidGFibGUuc3BsaXQudGFibGUiLCBJbmYpCmBgYAoKCiMgSW50cm9kdWN0aW9uCgpXZSB3aWxsIHBhcnNlIHRoZSBkYXRhIHRvIGNyZWF0ZSByZWdpb25hbCBhc3NvY2lhdGlvbiBwbG90cyBmb3IgZWFjaCBvZiB0aGUgMTEgbG9jaS4gCgojIFNldHRpbmcgdGhlIE5QRyBjb2xvcnMKCmBgYHtyfQpsaWJyYXJ5KCJzY2FsZXMiKQpwYWxfbnBnKCJucmMiKSgxMCkKc2hvd19jb2wocGFsX25wZygibnJjIikoMTApKQoKIyBzaG93X2NvbChwYWxfbnBnKCJucmMiLCBhbHBoYSA9IDAuNikoMTApKQoKYGBgCgoKIyBMb2FkIGRhdGEKCiMjIEV1cm9wZWFuIGFuZCBBZnJpY2FuLUFtZXJpY2FuCgpXZSBuZWVkIHRvIGxvYWQgdGhlIG1ldGEtYW5hbHlzaXMgc3VtbWFyeSBzdGF0aXN0aWNzIGZyb20gdGhlIEV1cm9wZWFuIC0gQWZyaWNhbi1BbWVyaWNhbiBhbmNlc3RyeSBhbmFseXNpcyBmaXJzdC4KYGBge3J9Cgpnd2FzX3N1bXN0YXRzX3JhY2VyX0VBX0FBIDwtIHJlYWRSRFMoZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiL2d3YXNfc3Vtc3RhdHNfY29tcGxldGVfcmFjZXIuRUFfQUEucmRzIikpCgpgYGAKCiMjIEV1cm9wZWFuLW9ubHkKCldlIG5lZWQgdG8gbG9hZCB0aGUgbWV0YS1hbmFseXNpcyBzdW1tYXJ5IHN0YXRpc3RpY3MgZnJvbSB0aGUgRXVyb3BlYW4tb25seSBhbmNlc3RyeSBhbmFseXNpcy4KYGBge3J9CgojIGd3YXNfc3Vtc3RhdHNfRUEgPC0gZnJlYWQocGFzdGUwKEdXQVNfbG9jLCIvQ0FDMTAwMEdfRUFfRklOQUxfRlVNQS50eHQuZ3oiKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1Byb2dyZXNzID0gVFJVRSkKIyBuYW1lcyhnd2FzX3N1bXN0YXRzX0VBKVtuYW1lcyhnd2FzX3N1bXN0YXRzX0VBKSA9PSAiUG9zIl0gPC0gIlBvc2l0aW9uIgojIHNhdmVSRFMoZ3dhc19zdW1zdGF0c19FQSwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiL2d3YXNfc3Vtc3RhdHMuRUEucmRzIikpCiMgCiMgZ3dhc19zdW1zdGF0c19yYWNlcl9FQSA8LSBzdWJzZXQoZ3dhc19zdW1zdGF0c19FQSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgPSBjKCJNYXJrZXJOYW1lIiwgInJzSUQiLCAiQ2hyIiwgIlBvc2l0aW9uIiwgIlB2YWx1ZSIpKQojIAojIHNhdmVSRFMoZ3dhc19zdW1zdGF0c19yYWNlcl9FQSwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiL2d3YXNfc3Vtc3RhdHNfcmFjZXIuRUEucmRzIikpCiMgcm0oZ3dhc19zdW1zdGF0c19FQSkKCmd3YXNfc3Vtc3RhdHNfcmFjZXJfRUEgPC0gcmVhZFJEUyhmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvZ3dhc19zdW1zdGF0c19yYWNlci5FQS5yZHMiKSkKCmBgYAoKCiMjIEFmcmljYW4tQW1lcmljYW4tb25seQoKV2UgbmVlZCB0byBsb2FkIHRoZSBtZXRhLWFuYWx5c2lzIHN1bW1hcnkgc3RhdGlzdGljcyBmcm9tIHRoZSBBZnJpY2FuLUFtZXJpY2FuLW9ubHkgYW5jZXN0cnkgYW5hbHlzaXMuCmBgYHtyfQojIGd3YXNfc3Vtc3RhdHNfdW5maWx0ZXJlZF9BQSA8LSBmcmVhZChwYXN0ZTAoR1dBU19sb2MsIi9DQUMxMDAwR19BQV9GSU5BTF9GVU1BLnVuZmlsdGVyZWQudHh0Lmd6IiksCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dQcm9ncmVzcyA9IFRSVUUpCiMgc2F2ZVJEUyhnd2FzX3N1bXN0YXRzX3VuZmlsdGVyZWRfQUEsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi9nd2FzX3N1bXN0YXRzX3VuZmlsdGVyZWQuQUEucmRzIikpCgojIGd3YXNfc3Vtc3RhdHNfcmFjZXJfdW5maWx0ZXJlZF9BQSA8LSBzdWJzZXQoZ3dhc19zdW1zdGF0c191bmZpbHRlcmVkX0FBLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCA9IGMoIk1hcmtlck5hbWUiLCAicnNJRCIsICJDaHIiLCAiUG9zaXRpb24iLCAiUHZhbHVlIikpCiMgCiMgc2F2ZVJEUyhnd2FzX3N1bXN0YXRzX3JhY2VyX3VuZmlsdGVyZWRfQUEsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi9nd2FzX3N1bXN0YXRzX3VuZmlsdGVyZWRfcmFjZXIuQUEucmRzIikpCiMgCiMgZ3dhc19zdW1zdGF0c19yYWNlcl91bmZpbHRlcmVkX0FBIDwtIHJlYWRSRFMoZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiL2d3YXNfc3Vtc3RhdHNfdW5maWx0ZXJlZF9yYWNlci5BQS5yZHMiKSkKCiMgCiMgZ3dhc19zdW1zdGF0c19BQSA8LSBmcmVhZChwYXN0ZTAoR1dBU19sb2MsIi9DQUMxMDAwR19BQV9GSU5BTF9GVU1BLmZpbHRlcmVkLnR4dC5neiIpLAojICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3MgPSBUUlVFKQojIHNhdmVSRFMoZ3dhc19zdW1zdGF0c19BQSwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiL2d3YXNfc3Vtc3RhdHMuQUEucmRzIikpCiMgCiMgZ3dhc19zdW1zdGF0c19yYWNlcl9BQSA8LSBzdWJzZXQoZ3dhc19zdW1zdGF0c19BQSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgPSBjKCJNYXJrZXJOYW1lIiwgInJzSUQiLCAiQ2hyIiwgIlBvc2l0aW9uIiwgIlB2YWx1ZSIpKQojIAojIHNhdmVSRFMoZ3dhc19zdW1zdGF0c19yYWNlcl9BQSwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiL2d3YXNfc3Vtc3RhdHNfcmFjZXIuQUEucmRzIikpCiMgcm0oZ3dhc19zdW1zdGF0c19BQSkKZ3dhc19zdW1zdGF0c19yYWNlcl9BQSA8LSByZWFkUkRTKGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi9nd2FzX3N1bXN0YXRzX3JhY2VyLkFBLnJkcyIpKQoKYGBgCgojIFJlZ2lvbmFsIGFzc29jaWF0aW9uIHBsb3R0aW5nOiBFVS1BQS1hbmNlc3RyeQoKIyMgVG9wIDExIGxvY2kKCldlIGFyZSBpbnRlcmVzdGVkIGluIDExIHRvcCBsb2NpLiBXZSB3aWxsIHBsb3QgdGhlc2UgdXNpbmcgdGhlIEVVLUFBLWFuY2VzdHJ5IGRhdGEuCgpgYGB7cn0KbGlicmFyeShvcGVueGxzeCkKdmFyaWFudF9saXN0IDwtIHJlYWQueGxzeChwYXN0ZTAoVEFSR0VUX2xvYywgIi9WYXJpYW50cy54bHN4IiksIHNoZWV0ID0gIlRvcExvY2kiKQoKRFQ6OmRhdGF0YWJsZSh2YXJpYW50X2xpc3QpCgpgYGAKCgojIyMgQWxsIGxvY2kKTGV0J3MgZG8gc29tZSBwbG90dGluZy4KCmBgYHtyfQpsaWJyYXJ5KFJBQ0VSKQojIE1ha2UgZGlyZWN0b3J5IGZvciBwbG90cwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiL1JBQ0VSIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiL1JBQ0VSIikpLCAKICAgICAgIEZBTFNFKQpSQUNFUl9sb2MgPSBwYXN0ZTAoUFJPSkVDVF9sb2MsIi9SQUNFUiIpCgp2YXJpYW50c19vZl9pbnRlcmVzdCA8LSBjKHZhcmlhbnRfbGlzdCRyc0lEKQoKdmFyaWFudHNfb2ZfaW50ZXJlc3RfZmV3Z2VuZXMgPC0gYygicnM5MzQ5Mzc5IikjLCAicnMzODQ0MDA2IiwgInJzMjg1NDc0NiIsICJyczQ5Nzc1NzUiLCAicnM5NjMzNTM1IiwgInJzMTEwNjMxMjAiLCAicnM5NTE1MjAzIiwgInJzNzE4MjEwMyIpCgpmb3IoVkFSSUFOVCBpbiB2YXJpYW50c19vZl9pbnRlcmVzdCl7CiAgY2F0KHBhc3RlMCgiR2V0dGluZyBkYXRhIGZvciAiLCBWQVJJQU5ULCIuXG4iKSkKCiAgdGVtcENIUiA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWyw1XQogIHRlbXBTVEFSVCA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWywxN10KICB0ZW1wRU5EIDwtIHN1YnNldCh2YXJpYW50X2xpc3QsIHJzSUQgPT0gVkFSSUFOVClbLDE4XQogIHRlbXBWQVJJQU5UbnIgPC0gc3Vic2V0KHZhcmlhbnRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssMV0KCiAgY2F0KCJcblN1YnNldCByZXF1aXJlZCBkYXRhLlxuIikKICB0ZW1wIDwtIHN1YnNldChnd2FzX3N1bXN0YXRzX3JhY2VyX0VBX0FBLCBDaHIgPT0gdGVtcENIUiAmIChQb3NpdGlvbiA+PSB0ZW1wU1RBUlQgJiBQb3NpdGlvbiA8PSB0ZW1wRU5EKSkKICAKICBjYXQoIlxuRm9ybWF0dGluZyBhc3NvY2lhdGlvbiBkYXRhLlxuIikKICB0ZW1wX2YgPSBSQUNFUjo6Zm9ybWF0UkFDRVIoYXNzb2NfZGF0YSA9IHRlbXAsIGNocl9jb2wgPSAzLCBwb3NfY29sID0gNCwgcF9jb2wgPSA1KQoKICBjYXQoIlxuR2V0dGluZyBMRCBkYXRhLlxuIikKICB0ZW1wX2ZfbGQgPSBSQUNFUjo6bGRSQUNFUihhc3NvY19kYXRhID0gdGVtcF9mLCByc19jb2wgPSAyLCBwb3BzID0gIkVVUiIsIGxlYWRfc25wID0gVkFSSUFOVCkKICAKICBjYXQocGFzdGUwKCJcblBsb3R0aW5nIHJlZ2lvbiBzdXJyb3VuZGluZyAiLCBWQVJJQU5ULCIgb24gIix0ZW1wQ0hSLCI6Iix0ZW1wU1RBUlQsIi0iLHRlbXBFTkQsIi5cbiIpKQogIHAxIDwtIHNpbmdsZVBsb3RSQUNFUjIoYXNzb2NfZGF0YSA9IHRlbXBfZl9sZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHIgPSB0ZW1wQ0hSLCBidWlsZCA9ICJoZzE5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90YnkgPSAic25wIiwgc25wX3Bsb3QgPSBWQVJJQU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfbGVhZCA9IFRSVUUsIGdlbmVfdHJhY2tfaCA9IDIsIGdlbmVfbmFtZV9zID0gMS43NSkKICAKICBwcmludChwMSkKICBjYXQocGFzdGUwKCJTYXZpbmcgaW1hZ2UgZm9yICIsIFZBUklBTlQsIi5cbiIpKQogICMgZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFJBQ0VSX2xvYywgIi8iLCB0ZW1wVkFSSUFOVG5yLCAiLiIsIFRvZGF5LCAiLiIsVkFSSUFOVCwiLnJlZ2lvbmFsX2Fzc29jLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCiAgIyBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUkFDRVJfbG9jLCAiLyIsIHRlbXBWQVJJQU5UbnIsICIuIiwgVG9kYXksICIuIixWQVJJQU5ULCIucmVnaW9uYWxfYXNzb2MucGRmIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAjIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9sb2MsICIvIiwgdGVtcFZBUklBTlRuciwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi5yZWdpb25hbF9hc3NvYy5lcHMiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKICAjIHJtKHRlbXAsIHAxLAogICMgICAgdGVtcF9mLCB0ZW1wX2ZfbGQsCiAgIyAgICB0ZW1wQ0hSLCB0ZW1wU1RBUlQsIHRlbXBFTkQsCiAgIyAgICBWQVJJQU5ULCB0ZW1wVkFSSUFOVG5yKQogIAp9CgoKYGBgCgojIyMgTG9jaSB3aXRoIG1hbnkgZ2VuZXMKVGhlc2UgYXJlIGdlbmV0aWMgbG9jaSB3aXRoIG1hbnkgZ2VuZXMuIAoKYGBge3J9Cgp2YXJpYW50c19vZl9pbnRlcmVzdF9tYW55Z2VuZXMgPC0gYygicnM3NDEyIiwgInJzMTA3NjI1NzciKQoKZm9yKFZBUklBTlQgaW4gdmFyaWFudHNfb2ZfaW50ZXJlc3RfbWFueWdlbmVzKXsKICBjYXQocGFzdGUwKCJHZXR0aW5nIGRhdGEgZm9yICIsIFZBUklBTlQsIi5cbiIpKQoKICB0ZW1wQ0hSIDwtIHN1YnNldCh2YXJpYW50X2xpc3QsIHJzSUQgPT0gVkFSSUFOVClbLDVdCiAgdGVtcFNUQVJUIDwtIHN1YnNldCh2YXJpYW50X2xpc3QsIHJzSUQgPT0gVkFSSUFOVClbLDE3XQogIHRlbXBFTkQgPC0gc3Vic2V0KHZhcmlhbnRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssMThdCiAgdGVtcFZBUklBTlRuciA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWywxXQoKICBjYXQoIlxuU3Vic2V0IHJlcXVpcmVkIGRhdGEuXG4iKQogIHRlbXAgPC0gc3Vic2V0KGd3YXNfc3Vtc3RhdHNfcmFjZXJfRUFfQUEsIENociA9PSB0ZW1wQ0hSICYgKFBvc2l0aW9uID49IHRlbXBTVEFSVCAmIFBvc2l0aW9uIDw9IHRlbXBFTkQpKQogIAogIGNhdCgiXG5Gb3JtYXR0aW5nIGFzc29jaWF0aW9uIGRhdGEuXG4iKQogIHRlbXBfZiA9IFJBQ0VSOjpmb3JtYXRSQUNFUihhc3NvY19kYXRhID0gdGVtcCwgY2hyX2NvbCA9IDMsIHBvc19jb2wgPSA0LCBwX2NvbCA9IDUpCgogIGNhdCgiXG5HZXR0aW5nIExEIGRhdGEuXG4iKQogIHRlbXBfZl9sZCA9IFJBQ0VSOjpsZFJBQ0VSKGFzc29jX2RhdGEgPSB0ZW1wX2YsIHJzX2NvbCA9IDIsIHBvcHMgPSAiRVVSIiwgbGVhZF9zbnAgPSBWQVJJQU5UKQogIAogIGNhdChwYXN0ZTAoIlxuUGxvdHRpbmcgcmVnaW9uIHN1cnJvdW5kaW5nICIsIFZBUklBTlQsIiBvbiAiLHRlbXBDSFIsIjoiLHRlbXBTVEFSVCwiLSIsdGVtcEVORCwiLlxuIikpCiAgcDEgPC0gc2luZ2xlUGxvdFJBQ0VSMihhc3NvY19kYXRhID0gdGVtcF9mX2xkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNociA9IHRlbXBDSFIsIGJ1aWxkID0gImhnMTkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RieSA9ICJzbnAiLCBzbnBfcGxvdCA9IFZBUklBTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9sZWFkID0gVFJVRSwgZ2VuZV90cmFja19oID0gMC43NSwgZ2VuZV9uYW1lX3MgPSAxLjc1KQogIAogIHByaW50KHAxKQogIGNhdChwYXN0ZTAoIlNhdmluZyBpbWFnZSBmb3IgIiwgVkFSSUFOVCwiLlxuIikpCiAgIyBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUkFDRVJfbG9jLCAiLyIsIHRlbXBWQVJJQU5UbnIsICIuIiwgVG9kYXksICIuIixWQVJJQU5ULCIucmVnaW9uYWxfYXNzb2MucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAjIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9sb2MsICIvIiwgdGVtcFZBUklBTlRuciwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi5yZWdpb25hbF9hc3NvYy5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQogICMgZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFJBQ0VSX2xvYywgIi8iLCB0ZW1wVkFSSUFOVG5yLCAiLiIsIFRvZGF5LCAiLiIsVkFSSUFOVCwiLnJlZ2lvbmFsX2Fzc29jLmVwcyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCiAgCiAgcm0odGVtcCwgcDEsCiAgICAgdGVtcF9mLCB0ZW1wX2ZfbGQsCiAgICAgdGVtcENIUiwgdGVtcFNUQVJULCB0ZW1wRU5ELAogICAgIFZBUklBTlQsIHRlbXBWQVJJQU5UbnIpCiAgCn0KYGBgCgojIyMgQ1hDTDEyCgpUaGUgX0NYQ0wxMl8gZ2VuZXRpYyBsb2N1cy4KCmBgYHtyfQp2YXJpYW50c19vZl9pbnRlcmVzdF9jeGNsMTIgPC0gYygicnMxMDg5OTk3MCIpCgpmb3IoVkFSSUFOVCBpbiB2YXJpYW50c19vZl9pbnRlcmVzdF9jeGNsMTIpewogIGNhdChwYXN0ZTAoIkdldHRpbmcgZGF0YSBmb3IgIiwgVkFSSUFOVCwiLlxuIikpCgogIHRlbXBDSFIgPC0gc3Vic2V0KHZhcmlhbnRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssNV0KICB0ZW1wU1RBUlQgPC0gc3Vic2V0KHZhcmlhbnRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssMTddCiAgdGVtcEVORCA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWywxOF0KICB0ZW1wVkFSSUFOVG5yIDwtIHN1YnNldCh2YXJpYW50X2xpc3QsIHJzSUQgPT0gVkFSSUFOVClbLDFdCgogIGNhdCgiXG5TdWJzZXQgcmVxdWlyZWQgZGF0YS5cbiIpCiAgdGVtcCA8LSBzdWJzZXQoZ3dhc19zdW1zdGF0c19yYWNlcl9FQV9BQSwgQ2hyID09IHRlbXBDSFIgJiAoUG9zaXRpb24gPj0gdGVtcFNUQVJUICYgUG9zaXRpb24gPD0gdGVtcEVORCkpCiAgCiAgY2F0KCJcbkZvcm1hdHRpbmcgYXNzb2NpYXRpb24gZGF0YS5cbiIpCiAgdGVtcF9mID0gUkFDRVI6OmZvcm1hdFJBQ0VSKGFzc29jX2RhdGEgPSB0ZW1wLCBjaHJfY29sID0gMywgcG9zX2NvbCA9IDQsIHBfY29sID0gNSkKCiAgY2F0KCJcbkdldHRpbmcgTEQgZGF0YS5cbiIpCiAgdGVtcF9mX2xkID0gUkFDRVI6OmxkUkFDRVIoYXNzb2NfZGF0YSA9IHRlbXBfZiwgcnNfY29sID0gMiwgcG9wcyA9ICJFVVIiLCBsZWFkX3NucCA9IFZBUklBTlQpCiAgCiAgY2F0KHBhc3RlMCgiXG5QbG90dGluZyByZWdpb24gc3Vycm91bmRpbmcgIiwgVkFSSUFOVCwiIG9uICIsdGVtcENIUiwiOiIsdGVtcFNUQVJULCItIix0ZW1wRU5ELCIuXG4iKSkKICBwMSA8LSBzaW5nbGVQbG90UkFDRVIyKGFzc29jX2RhdGEgPSB0ZW1wX2ZfbGQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyID0gdGVtcENIUiwgYnVpbGQgPSAiaGcxOSIsIHNldCA9ICJhbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGJ5ID0gInNucCIsIHNucF9wbG90ID0gVkFSSUFOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX2xlYWQgPSBUUlVFLCBnZW5lX3RyYWNrX2ggPSAwLjc1LCBnZW5lX25hbWVfcyA9IDEuNzUpCiAgCiAgcHJpbnQocDEpCiAgY2F0KHBhc3RlMCgiU2F2aW5nIGltYWdlIGZvciAiLCBWQVJJQU5ULCIuXG4iKSkKICAjIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9sb2MsICIvIiwgdGVtcFZBUklBTlRuciwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi5yZWdpb25hbF9hc3NvYy5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQogICMgZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFJBQ0VSX2xvYywgIi8iLCB0ZW1wVkFSSUFOVG5yLCAiLiIsIFRvZGF5LCAiLiIsVkFSSUFOVCwiLnJlZ2lvbmFsX2Fzc29jLnBkZiIpLCBwbG90ID0gbGFzdF9wbG90KCkpCiAgIyBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUkFDRVJfbG9jLCAiLyIsIHRlbXBWQVJJQU5UbnIsICIuIiwgVG9kYXksICIuIixWQVJJQU5ULCIucmVnaW9uYWxfYXNzb2MuZXBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAKICBybSh0ZW1wLCBwMSwKICAgICB0ZW1wX2YsIHRlbXBfZl9sZCwKICAgICB0ZW1wQ0hSLCB0ZW1wU1RBUlQsIHRlbXBFTkQsCiAgICAgVkFSSUFOVCwgdGVtcFZBUklBTlRucikKICAKfQpgYGAKCiMjIEFkZGl0aW9uYWwgcmVnaW9uYWwgcGxvdHMKCiMjIyBMaXN0aW5nIHJlZ2lvbnMgb2YgaW50ZXJlc3QKCldlIHdhbnQgdG8gY3JlYXRlIHNvbWUgcmVnaW9uYWwgYXNzb2NpYXRpb24gcGxvdHMgdG8gY29tYmluZSB3aXRoIHRlaCBVQ1NDIGJyb3dzZXIgdHJhY2tzLCB0aHVzIHdlIG5lZWQgdGhlIGV4YWN0IHNhbWUgcmVnaW9ucy4gCgpgYGB7cn0KbGlicmFyeShvcGVueGxzeCkKYWRkX2xpc3QgPC0gcmVhZC54bHN4KHBhc3RlMChUQVJHRVRfbG9jLCAiL1ZhcmlhbnRzLnhsc3giKSwgc2hlZXQgPSAiQWRkaXRpb25hbFBsb3RzIikKCkRUOjpkYXRhdGFibGUoYWRkX2xpc3QpCgpgYGAKCiMjIyBDcmVkaWJsZSBTZXRzCgpXZSB3YW50IHRvIGNvbG9yIHRoZSBjcmVkaWJsZSBzZXRzLCB3aGljaCB3ZSBsb2FkIGhlcmUuCgpgYGB7cn0KY3JlZHNldCA8LSBhc190aWJibGUoZnJlYWQocGFzdGUwKFBST0pFQ1RfbG9jLCAiL0NyZWRpYmxlU2V0cy9DQUNfRVVSX0FGUl9jcmVkX3NldF9hbGxfbG9jaV81MGtiLnR4dCIpKSkKCmNyZWRzZXQKYGBgCgojIyMgQ29tYmluaW5nIEdXQVMgd2l0aCBDcmVkaWJsZSBTZXQKCldlIHdhbnQgdG8gYWRkIHRoZSBwb3N0ZXJpb3IgcHJvYmFiaWxpdGllcyBhbmQgbWFrZSBhIHZhcmlhYmxlIHRvIGNvbG9yIGJ5LgpgYGB7cn0KCmd3YXNfc3Vtc3RhdHNfcmFjZXJfY3JlZHNldCA8LSBtZXJnZShnd2FzX3N1bXN0YXRzX3JhY2VyX0VBX0FBLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRzZXQgJT4lIHNlbGVjdChSU0lELCBQb3N0ZXJpb3JfUHJvYiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueCA9ICJyc0lEIiwgYnkueSA9ICJSU0lEIiwgYWxsLnggPSBUUlVFKSAlPiUKICAjIG11dGF0ZSguLCBQb3N0ZXJpb3JfUHJvYiA9IGlmZWxzZShpcy5uYShQb3N0ZXJpb3JfUHJvYiksIDAsIFBvc3Rlcmlvcl9Qcm9iKSkgJT4lCiAgbXV0YXRlKENyZWRTZXQgPSBjYXNlX3doZW4oUG9zdGVyaW9yX1Byb2IgPiAwIH4gJzk1JSBjcmVkaWJsZSBzZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAnbm90IGluIGNyZWRpYmxlIHNldCcpKQoKaGVhZChnd2FzX3N1bXN0YXRzX3JhY2VyX2NyZWRzZXQpCgp0YWJsZShnd2FzX3N1bXN0YXRzX3JhY2VyX2NyZWRzZXQkQ3JlZFNldCkKCnN1bW1hcnkoZ3dhc19zdW1zdGF0c19yYWNlcl9jcmVkc2V0JFBvc3Rlcmlvcl9Qcm9iKQoKYGBgCgojIyMgUGxvdHRpbmcKCmBgYHtyfQpsaWJyYXJ5KFJBQ0VSKQojIGxpYnJhcnkocGxvdGx5KQoKIyBNYWtlIGRpcmVjdG9yeSBmb3IgcGxvdHMKaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChQUk9KRUNUX2xvYywgIi9SQUNFUiIpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChQUk9KRUNUX2xvYywgIi9SQUNFUiIpKSwgCiAgICAgICBGQUxTRSkKUkFDRVJfbG9jID0gcGFzdGUwKFBST0pFQ1RfbG9jLCIvUkFDRVIiKQoKdmFyaWFudHNfb2ZfaW50ZXJlc3QgPC0gYyhhZGRfbGlzdCRyc0lEKQoKCmZvcihWQVJJQU5UIGluIHZhcmlhbnRzX29mX2ludGVyZXN0KXsKICBjYXQocGFzdGUwKCJHZXR0aW5nIGRhdGEgZm9yICIsIFZBUklBTlQsIi5cbiIpKQoKICB0ZW1wQ0hSIDwtIHN1YnNldChhZGRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssNF0KICB0ZW1wU1RBUlQgPC0gc3Vic2V0KGFkZF9saXN0LCByc0lEID09IFZBUklBTlQpWyw1XQogIHRlbXBFTkQgPC0gc3Vic2V0KGFkZF9saXN0LCByc0lEID09IFZBUklBTlQpWyw2XQogIHRlbXBOQU1FIDwtIHN1YnNldChhZGRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssM10KCiAgY2F0KCJcblN1YnNldCByZXF1aXJlZCBkYXRhLlxuIikKICB0ZW1wIDwtIHN1YnNldChnd2FzX3N1bXN0YXRzX3JhY2VyX2NyZWRzZXQsIENociA9PSB0ZW1wQ0hSICYgKFBvc2l0aW9uID49IHRlbXBTVEFSVCAmIFBvc2l0aW9uIDw9IHRlbXBFTkQpKQogIAogIGNhdCgiXG5Gb3JtYXR0aW5nIGFzc29jaWF0aW9uIGRhdGEuXG4iKQogIHRlbXBfZiA9IFJBQ0VSOjpmb3JtYXRSQUNFUihhc3NvY19kYXRhID0gdGVtcCwgY2hyX2NvbCA9IDMsIHBvc19jb2wgPSA0LCBwX2NvbCA9IDUpCgogIGNhdCgiXG5HZXR0aW5nIExEIGRhdGEuXG4iKQogICMgdGVtcF9mX2xkID0gUkFDRVI6OmxkUkFDRVIoYXNzb2NfZGF0YSA9IHRlbXBfZiwgcnNfY29sID0gMiwgcG9wcyA9ICJFVVIiLCBsZWFkX3NucCA9IFZBUklBTlQpCiAgCiAgY2F0KHBhc3RlMCgiXG5QbG90dGluZyByZWdpb24gc3Vycm91bmRpbmcgIiwgVkFSSUFOVCwiIG9uICIsdGVtcENIUiwiOiIsdGVtcFNUQVJULCItIix0ZW1wRU5ELCIuXG4iKSkKICAKICBwMSA8LSBzaW5nbGVQbG90UkFDRVIyKGFzc29jX2RhdGEgPSB0ZW1wX2YsIAogICAgICAgICAgICAgICAgICAgICAgICAgY2hyID0gdGVtcENIUiwgYnVpbGQgPSAiaGcxOSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgcGxvdGJ5ID0gImNvb3JkIiwgc25wX3Bsb3QgPSBWQVJJQU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcGxvdCA9IHRlbXBTVEFSVCwgZW5kX3Bsb3QgPSB0ZW1wRU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfbGVhZCA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXlfY29sb3JzID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgY3JlZF9zZXQgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfdHJhY2tfaCA9IDMsIGdlbmVfbmFtZV9zID0gMS43NSkKICAKICBwcmludChwMSkKICAKICBjYXQocGFzdGUwKCJTYXZpbmcgaW1hZ2UgZm9yICIsIFZBUklBTlQsIi5cbiIpKQogICMgZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFJBQ0VSX2xvYywgIi8iLCB0ZW1wTkFNRSwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi4iLHRlbXBTVEFSVCwiLiIsdGVtcEVORCwiLnJlZ2lvbmFsX2Fzc29jLnBuZyIpLCBwbG90ID0gcDEpCiAgIyBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUkFDRVJfbG9jLCAiLyIsIHRlbXBOQU1FLCAiLiIsIFRvZGF5LCAiLiIsVkFSSUFOVCwiLiIsdGVtcFNUQVJULCIuIix0ZW1wRU5ELCIucmVnaW9uYWxfYXNzb2MucGRmIiksIHBsb3QgPSBwMSkKICAjIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9sb2MsICIvIiwgdGVtcE5BTUUsICIuIiwgVG9kYXksICIuIixWQVJJQU5ULCIuIix0ZW1wU1RBUlQsIi4iLHRlbXBFTkQsIi5yZWdpb25hbF9hc3NvYy5lcHMiKSwgcGxvdCA9IHAxKQoKICAjIHByaW50KGdncGxvdGx5KHAxKSkKICBybSh0ZW1wLCBwMSwKICAgICB0ZW1wX2YsCiAgICAgdGVtcENIUiwgdGVtcFNUQVJULCB0ZW1wRU5ELAogICAgIFZBUklBTlQsIHRlbXBOQU1FKQp9CmBgYAoKCiMjIFJlZ2lvbmFsIGFzc29jaWF0aW9uIHBsb3RzIGluIEFmcmljYW4tQW1lcmljYW4KCk5vdGUgaGVyZSB0aGF0IHdlIHBsb3QgdGhlIHJlZ2lvbiwgYW5kIG5vdCBiYXNlZCBvbiB0aGUgbGVhZCB2YXJpYW50IG9mIHRoZSBFQS1BQSBhbmFseXNlcy4KCmBgYHtyfQpsaWJyYXJ5KFJBQ0VSKQojIE1ha2UgZGlyZWN0b3J5IGZvciBwbG90cwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiL1JBQ0VSX0FBIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiL1JBQ0VSX0FBIikpLCAKICAgICAgIEZBTFNFKQpSQUNFUl9BQV9sb2MgPSBwYXN0ZTAoUFJPSkVDVF9sb2MsIi9SQUNFUl9BQSIpCgp2YXJpYW50c19vZl9pbnRlcmVzdCA8LSBjKHZhcmlhbnRfbGlzdCRyc0lEKQoKdmFyaWFudHNfb2ZfaW50ZXJlc3RfZmV3Z2VuZXMgPC0gYygicnM5MzQ5Mzc5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJzMzg0NDAwNiIsICMgdGhyb3dzIGFuIGVycm9yIHdoaWNoIEkgZG9uJ3QgdW5kZXJzdGFuZCBpbW1lZGlhdGVseSAtIGNvdWxkIGJlIHRoYXQgdGhlIHZhcmlhbnQgaXMgbm90IHByZXNlbnQgaW4gQUEgMTAwMEcgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczI4NTQ3NDYiLCAicnM0OTc3NTc1IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJzMTA4OTk5NzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczk2MzM1MzUiLCAjIHRoaXMgb25lIHRocm93cyBhbiBMRCBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczEwNzYyNTc3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnMxMTA2MzEyMCIsICJyczk1MTUyMDMiLCAicnM3MTgyMTAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnM3NDEyIikKCmZvcihWQVJJQU5UIGluIHZhcmlhbnRzX29mX2ludGVyZXN0KXsKICBjYXQocGFzdGUwKCJHZXR0aW5nIGRhdGEgZm9yICIsIFZBUklBTlQsIi5cbiIpKQoKICB0ZW1wQ0hSIDwtIHN1YnNldCh2YXJpYW50X2xpc3QsIHJzSUQgPT0gVkFSSUFOVClbLDVdCiAgdGVtcFNUQVJUIDwtIHN1YnNldCh2YXJpYW50X2xpc3QsIHJzSUQgPT0gVkFSSUFOVClbLDE3XQogIHRlbXBFTkQgPC0gc3Vic2V0KHZhcmlhbnRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssMThdCiAgdGVtcFZBUklBTlRuciA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWywxXQoKICBjYXQoIlxuU3Vic2V0IHJlcXVpcmVkIGRhdGEuXG4iKQogIHRlbXAgPC0gc3Vic2V0KGd3YXNfc3Vtc3RhdHNfcmFjZXJfQUEsIENociA9PSB0ZW1wQ0hSICYgKFBvc2l0aW9uID49IHRlbXBTVEFSVCAmIFBvc2l0aW9uIDw9IHRlbXBFTkQpKQoKICBjYXQoIlxuRm9ybWF0dGluZyBhc3NvY2lhdGlvbiBkYXRhLlxuIikKICB0ZW1wX2YgPSBSQUNFUjo6Zm9ybWF0UkFDRVIoYXNzb2NfZGF0YSA9IHRlbXAsIGNocl9jb2wgPSAzLCBwb3NfY29sID0gNCwgcF9jb2wgPSA1KQogIAogICMgY2F0KCJcbkdldHRpbmcgTEQgZGF0YS5cbiIpCiAgdGVtcF9mX2xkID0gUkFDRVI6OmxkUkFDRVIoYXNzb2NfZGF0YSA9IHRlbXBfZiwgcnNfY29sID0gMiwgcG9wcyA9ICJBRlIiLCBsZWFkX3NucCA9IFZBUklBTlQpCgogIGNhdChwYXN0ZTAoIlxuUGxvdHRpbmcgcmVnaW9uIHN1cnJvdW5kaW5nICIsIFZBUklBTlQsIiBvbiAiLHRlbXBDSFIsIjoiLHRlbXBTVEFSVCwiLSIsdGVtcEVORCwiLlxuIikpCgogIHAxIDwtIHNpbmdsZVBsb3RSQUNFUjIoYXNzb2NfZGF0YSA9IHRlbXBfZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHIgPSB0ZW1wQ0hSLCBidWlsZCA9ICJoZzE5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBwbG90YnkgPSAiY29vcmQiLCBzbnBfcGxvdCA9IFZBUklBTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wbG90ID0gdGVtcFNUQVJULCBlbmRfcGxvdCA9IHRlbXBFTkQsCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9sZWFkID0gRkFMU0UsIGdlbmVfdHJhY2tfaCA9IDIsIGdlbmVfbmFtZV9zID0gMS43NSkKICAKICBwcmludChwMSkKICBjYXQocGFzdGUwKCJTYXZpbmcgaW1hZ2UgZm9yICIsIFZBUklBTlQsIi5cbiIpKQogIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9BQV9sb2MsICIvIiwgdGVtcFZBUklBTlRuciwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi5yZWdpb25hbF9hc3NvYy5BQS5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQogIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9BQV9sb2MsICIvIiwgdGVtcFZBUklBTlRuciwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi5yZWdpb25hbF9hc3NvYy5BQS5wZGYiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQogIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9BQV9sb2MsICIvIiwgdGVtcFZBUklBTlRuciwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi5yZWdpb25hbF9hc3NvYy5BQS5lcHMiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKICBybSh0ZW1wLCBwMSwKICAgICB0ZW1wX2YsIHRlbXBfZl9sZCwKICAgICB0ZW1wQ0hSLCB0ZW1wU1RBUlQsIHRlbXBFTkQsCiAgICAgVkFSSUFOVCwgdGVtcFZBUklBTlRucikKICAKfQoKYGBgCgojIEFwcHJveGltYXRlIEJheWVzIEZhY3RvciBjb2xvY2FsaXNhdGlvbiBhbmFseXNlcwoKVGhlIGlkZWEgYmVoaW5kIHRoZSAqQXBwcm94aW1hdGUgQmF5ZXMgRmFjdG9yIChBQkYpKiBhbmFseXNpcyBpcyB0aGF0IHRoZSBhc3NvY2lhdGlvbiBvZiBlYWNoIHRyYWl0IHdpdGggU05QcyBpbiBhIHJlZ2lvbiBtYXkgYmUgc3VtbWFyaXNlZCBieSBhIHZlY3RvciBvZiAwcyBhbmQgYXQgbW9zdCBhIHNpbmdsZSAxLCB3aXRoIHRoZSAxIGluZGljYXRpbmcgdGhlIGNhdXNhbCBTTlAgKHNvLCBhc3N1bWluZyBhIHNpbmdsZSBjYXVzYWwgU05QIGZvciBlYWNoIHRyYWl0KS4gCgpUaGUgcG9zdGVyaW9yIHByb2JhYmlsaXR5IG9mIGVhY2ggcG9zc2libGUgY29uZmlndXJhdGlvbiBjYW4gYmUgY2FsY3VsYXRlZCBhbmQgc28sIGNydWNpYWxseSwgY2FuIHRoZSBwb3N0ZXJpb3IgcHJvYmFiaWxpdGllcyB0aGF0IHRoZSB0cmFpdHMgc2hhcmUgdGhlaXIgY29uZmlndXJhdGlvbnMuIFRoaXMgYWxsb3dzIHVzIHRvIGVzdGltYXRlIHRoZSBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nIGNhc2VzLCBpLmUuIGh5cG90aGVzZXM6CgrwnZC7MDogbmVpdGhlciB0cmFpdCBoYXMgYSBnZW5ldGljIGFzc29jaWF0aW9uIGluIHRoZSByZWdpb24K8J2QuzE6IG9ubHkgdHJhaXQgMSBoYXMgYSBnZW5ldGljIGFzc29jaWF0aW9uIGluIHRoZSByZWdpb24K8J2QuzI6IG9ubHkgdHJhaXQgMiBoYXMgYSBnZW5ldGljIGFzc29jaWF0aW9uIGluIHRoZSByZWdpb24K8J2QuzM6IGJvdGggdHJhaXRzIGFyZSBhc3NvY2lhdGVkLCBidXQgd2l0aCBkaWZmZXJlbnQgY2F1c2FsIHZhcmlhbnRzCvCdkLs0OiBib3RoIHRyYWl0cyBhcmUgYXNzb2NpYXRlZCBhbmQgc2hhcmUgYSBzaW5nbGUgY2F1c2FsIHZhcmlhbnQKClRvIHdoYXQgZXh0ZW50IGRvIHRoZSBsb2NpIGJldHdlZW4gRXVyb3BlYW4gYW5kIEFmcmljYW4tQW1lcmljYW4gYW5jZXN0cmllcyBvdmVybGFwPyBXZSBhcmUgd29ya2luZyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSAxMSBsb2NpIGFyZSBfdGhlXyBsb2NpIGFuZCB3aWxsIHRlc3Qgd2hldGhlciB0aGVzZSBvdmVybGFwLCBfaS5lLl8gY29sb2NhbGl6ZS4KCiMjIFByZXBhcmF0aW9uCgpMZXQncyBtYWtlIHN1cmUgd2UgaGF2ZSBgcmVtb3Rlc2AgYW5kIGBjb2xvY2AgaW5zdGFsbGVkLiAKYGBge3J9CmlmKCFyZXF1aXJlKCJyZW1vdGVzIikpCiAgIGluc3RhbGwucGFja2FnZXMoInJlbW90ZXMiKSAjIGlmIG5lY2Vzc2FyeQpsaWJyYXJ5KHJlbW90ZXMpCmluc3RhbGxfZ2l0aHViKCJjaHIxc3dhbGxhY2UvY29sb2NAbWFpbiIsCiAgICAgICAgICAgICAgIGJ1aWxkX3ZpZ25ldHRlcyA9IFRSVUUpCgpsaWJyYXJ5KGNvbG9jKQoKYGBgCgojIyBWaXN1YWxpemF0aW9uCgpXZSBjYW4gY3JlYXRlIG1pcnJvciBhbmQgc2NhdHRlciBwbG90IGZvciBlYWNoIHJlZ2lvbi4gCgpgYGB7cn0KCmxpYnJhcnkoUkFDRVIpCiMgTWFrZSBkaXJlY3RvcnkgZm9yIHBsb3RzCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoUFJPSkVDVF9sb2MsICIvUkFDRVJfRUFfdnNfQUEiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoUFJPSkVDVF9sb2MsICIvUkFDRVJfRUFfdnNfQUEiKSksIAogICAgICAgRkFMU0UpClJBQ0VSX0VBX3ZzX0FBX2xvYyA9IHBhc3RlMChQUk9KRUNUX2xvYywiL1JBQ0VSX0VBX3ZzX0FBIikKCnZhcmlhbnRzX29mX2ludGVyZXN0IDwtIGModmFyaWFudF9saXN0JHJzSUQpCgojIHZhcmlhbnRzX29mX2ludGVyZXN0X2Zld2dlbmVzIDwtIGMoInJzOTM0OTM3OSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJzMzg0NDAwNiIsICMgdGhyb3dzIGFuIGVycm9yIHdoaWNoIEkgZG9uJ3QgdW5kZXJzdGFuZCBpbW1lZGlhdGVseSAtIGNvdWxkIGJlIHRoYXQgdGhlIHZhcmlhbnQgaXMgbm90IHByZXNlbnQgaW4gQUEgMTAwMEcgZGF0YQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJzMjg1NDc0NiIsICJyczQ5Nzc1NzUiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczEwODk5OTcwIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczk2MzM1MzUiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczEwNzYyNTc3IiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczExMDYzMTIwIiwgInJzOTUxNTIwMyIsICJyczcxODIxMDMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJzNzQxMiIpCnZhcmlhbnRzX29mX2ludGVyZXN0X2Zld2dlbmVzIDwtIGMoInJzMTA3NjI1NzciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczExMDYzMTIwIiwgInJzOTUxNTIwMyIsICJyczcxODIxMDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyczc0MTIiKQpmb3IoVkFSSUFOVCBpbiB2YXJpYW50c19vZl9pbnRlcmVzdCl7CiAgY2F0KHBhc3RlMCgiR2V0dGluZyBkYXRhIGZvciAiLCBWQVJJQU5ULCIuXG4iKSkKCiAgdGVtcENIUiA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWyw1XQogIHRlbXBTVEFSVCA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWywxN10KICB0ZW1wRU5EIDwtIHN1YnNldCh2YXJpYW50X2xpc3QsIHJzSUQgPT0gVkFSSUFOVClbLDE4XQogIHRlbXBWQVJJQU5UbnIgPC0gc3Vic2V0KHZhcmlhbnRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssMV0KCiAgY2F0KCJcblN1YnNldCByZXF1aXJlZCBkYXRhLlxuIikKICB0ZW1wMSA8LSBzdWJzZXQoZ3dhc19zdW1zdGF0c19yYWNlcl9FQSwgQ2hyID09IHRlbXBDSFIgJiAoUG9zaXRpb24gPj0gdGVtcFNUQVJUICYgUG9zaXRpb24gPD0gdGVtcEVORCkpCiAgdGVtcDIgPC0gc3Vic2V0KGd3YXNfc3Vtc3RhdHNfcmFjZXJfQUEsIENociA9PSB0ZW1wQ0hSICYgKFBvc2l0aW9uID49IHRlbXBTVEFSVCAmIFBvc2l0aW9uIDw9IHRlbXBFTkQpKQoKICBjYXQoIlxuRm9ybWF0dGluZyBhc3NvY2lhdGlvbiBkYXRhLlxuIikKICB0ZW1wX2YxID0gUkFDRVI6OmZvcm1hdFJBQ0VSKGFzc29jX2RhdGEgPSB0ZW1wMSwgY2hyX2NvbCA9IDMsIHBvc19jb2wgPSA0LCBwX2NvbCA9IDUpCiAgdGVtcF9mMiA9IFJBQ0VSOjpmb3JtYXRSQUNFUihhc3NvY19kYXRhID0gdGVtcDIsIGNocl9jb2wgPSAzLCBwb3NfY29sID0gNCwgcF9jb2wgPSA1KQogIAogICMgY2F0KCJcbkdldHRpbmcgTEQgZGF0YS5cbiIpCiAgdGVtcF9mX2xkMSA9IFJBQ0VSOjpsZFJBQ0VSKGFzc29jX2RhdGEgPSB0ZW1wX2YxLCByc19jb2wgPSAyLCBwb3BzID0gIkVVUiIsIGxlYWRfc25wID0gVkFSSUFOVCkKICB0ZW1wX2ZfbGQyID0gUkFDRVI6OmxkUkFDRVIoYXNzb2NfZGF0YSA9IHRlbXBfZjIsIHJzX2NvbCA9IDIsIHBvcHMgPSAiQUZSIiwgbGVhZF9zbnAgPSBWQVJJQU5UKQoKICBjYXQocGFzdGUwKCJcblBsb3R0aW5nIHJlZ2lvbiBzdXJyb3VuZGluZyAiLCBWQVJJQU5ULCIgb24gIix0ZW1wQ0hSLCI6Iix0ZW1wU1RBUlQsIi0iLHRlbXBFTkQsIi5cbiIpKQoKICBwMSA8LSBtaXJyb3JQbG90UkFDRVIoYXNzb2NfZGF0YTEgPSB0ZW1wX2ZfbGQxLCAKICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NfZGF0YTIgPSB0ZW1wX2ZfbGQyLCAKICAgICAgICAgICAgICAgICAgICAgICAgY2hyID0gdGVtcENIUiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUxID0gIkV1cm9wZWFuIGFuY2VzdHJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lMiA9ICJBZnJpY2FuLUFtZXJpY2FuIGFuY2VzdHJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RieSA9ICJjb29yZCIsIAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wbG90ID0gdGVtcFNUQVJULCBlbmRfcGxvdCA9IHRlbXBFTkQpCiAgCiAgcHJpbnQocDEpCiAgCiAgcDIgPC0gc2NhdHRlclBsb3RSQUNFUihhc3NvY19kYXRhMSA9IHRlbXBfZl9sZDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NfZGF0YTIgPSB0ZW1wX2ZfbGQyLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNociA9IHRlbXBDSFIsIAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTEgPSAiRXVyb3BlYW4gYW5jZXN0cnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUyID0gIkFmcmljYW4tQW1lcmljYW4gYW5jZXN0cnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9zdGFydCA9IHRlbXBTVEFSVCwgCiAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fZW5kID0gdGVtcEVORCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBsZF9kZiA9IDEpCiAgCiAgcHJpbnQocDIpCiAgCiAgY2F0KHBhc3RlMCgiU2F2aW5nIGltYWdlIGZvciAiLCBWQVJJQU5ULCIuXG4iKSkKICBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUkFDRVJfRUFfdnNfQUFfbG9jLCAiLyIsIHRlbXBWQVJJQU5UbnIsICIuIiwgVG9kYXksICIuIixWQVJJQU5ULCIucmVnaW9uYWxfbWlycm9yLkVBX3ZzX0FBLnBuZyIpLCBwbG90ID0gcDEpCiAgZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFJBQ0VSX0VBX3ZzX0FBX2xvYywgIi8iLCB0ZW1wVkFSSUFOVG5yLCAiLiIsIFRvZGF5LCAiLiIsVkFSSUFOVCwiLnJlZ2lvbmFsX21pcnJvci5FQV92c19BQS5wZGYiKSwgcGxvdCA9IHAxKQogIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9FQV92c19BQV9sb2MsICIvIiwgdGVtcFZBUklBTlRuciwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi5yZWdpb25hbF9taXJyb3IuRUFfdnNfQUEuZXBzIiksIHBsb3QgPSBwMSkKCiAgY2F0KHBhc3RlMCgiU2F2aW5nIGltYWdlIGZvciAiLCBWQVJJQU5ULCIuXG4iKSkKICBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoUkFDRVJfRUFfdnNfQUFfbG9jLCAiLyIsIHRlbXBWQVJJQU5UbnIsICIuIiwgVG9kYXksICIuIixWQVJJQU5ULCIucmVnaW9uYWxfc2NhdHRlci5FQV92c19BQS5wbmciKSwgcGxvdCA9IHAyKQogIGdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMChSQUNFUl9FQV92c19BQV9sb2MsICIvIiwgdGVtcFZBUklBTlRuciwgIi4iLCBUb2RheSwgIi4iLFZBUklBTlQsIi5yZWdpb25hbF9zY2F0dGVyLkVBX3ZzX0FBLnBkZiIpLCBwbG90ID0gcDIpCiAgZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKFJBQ0VSX0VBX3ZzX0FBX2xvYywgIi8iLCB0ZW1wVkFSSUFOVG5yLCAiLiIsIFRvZGF5LCAiLiIsVkFSSUFOVCwiLnJlZ2lvbmFsX3NjYXR0ZXIuRUFfdnNfQUEuZXBzIiksIHBsb3QgPSBwMikKCiAgCiAgcm0odGVtcDEsIHRlbXAyLAogICAgIHAxLHAyLAogICAgIHRlbXBfZjEsIHRlbXBfZl9sZDEsCiAgICAgdGVtcF9mMiwgdGVtcF9mX2xkMiwKICAgICB0ZW1wQ0hSLCB0ZW1wU1RBUlQsIHRlbXBFTkQsCiAgICAgVkFSSUFOVCwgdGVtcFZBUklBTlRucikKICAKfQoKCmBgYAoKIyMgUXVhbnRpZnkgY29sb2NhbGl6YXRpb24KCldlIHdhbnQgdG8gcXVhbnRpZnkgdGhlIG92ZXJsYXAuIAoKU2V0dGluZyB1cCBhbiBvdXRwdXQgZGlyZWN0b3J5IGZvciBgY29sb2NgLgoKYGBge3J9CmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoUFJPSkVDVF9sb2MsICIvQ09MT0NfRUFfdnNfQUEiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoUFJPSkVDVF9sb2MsICIvQ09MT0NfRUFfdnNfQUEiKSksIAogICAgICAgRkFMU0UpCkNPTE9DX0VBX3ZzX0FBX2xvYyA9IHBhc3RlMChQUk9KRUNUX2xvYywiL0NPTE9DX0VBX3ZzX0FBIikKCmBgYAoKCiMjIyBEYXRhIGNvbGxlYWN0aW9uCgpQcmVwYXJpbmcgZGF0YSBmb3IgYGNvbG9jYDogd2UgcmVxdWlyZSBiZXRhIGFuZCBzdGFuZGFyZCBlcnJvcnMgZm9yIGBjb2xvY2AuCgpGaXJzdCB0aGUgRXVyb3BlYW4gYW5jZXN0cnkgZGF0YSwgbmV4dCB0aGUgQWZyaWNhbi1BbWVyaWNhbiBhbmNlc3RyeSBkYXRhLgoKYGBge3J9Cmd3YXNfc3Vtc3RhdHNfRUEgPC0gZnJlYWQocGFzdGUwKEdXQVNfbG9jLCIvQ0FDMTAwMEdfRUFfRklOQUxfRlVNQS50eHQuZ3oiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dQcm9ncmVzcyA9IFRSVUUpCm5hbWVzKGd3YXNfc3Vtc3RhdHNfRUEpW25hbWVzKGd3YXNfc3Vtc3RhdHNfRUEpID09ICJQb3MiXSA8LSAiUG9zaXRpb24iCgpnd2FzX3N1bXN0YXRzX3JhY2VyX0VBIDwtIHN1YnNldChnd2FzX3N1bXN0YXRzX0VBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QgPSBjKCJNYXJrZXJOYW1lIiwgInJzSUQiLCAiQ2hyIiwgIlBvc2l0aW9uIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVmZmVjdCIsICJTdGRFcnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQdmFsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOIikpCnJtKGd3YXNfc3Vtc3RhdHNfRUEpCgpgYGAKCmBgYHtyfQpnd2FzX3N1bXN0YXRzX0FBIDwtIGZyZWFkKHBhc3RlMChHV0FTX2xvYywiL0NBQzEwMDBHX0FBX0ZJTkFMX0ZVTUEuZmlsdGVyZWQudHh0Lmd6IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBzaG93UHJvZ3Jlc3MgPSBUUlVFKQpuYW1lcyhnd2FzX3N1bXN0YXRzX0FBKVtuYW1lcyhnd2FzX3N1bXN0YXRzX0FBKSA9PSAiUG9zIl0gPC0gIlBvc2l0aW9uIgpuYW1lcyhnd2FzX3N1bXN0YXRzX0FBKVtuYW1lcyhnd2FzX3N1bXN0YXRzX0FBKSA9PSAiU0UiXSA8LSAiU3RkRXJyIgoKZ3dhc19zdW1zdGF0c19yYWNlcl9BQSA8LSBzdWJzZXQoZ3dhc19zdW1zdGF0c19BQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ID0gYygiTWFya2VyTmFtZSIsICJyc0lEIiwgIkNociIsICJQb3NpdGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZmZlY3QiLCAiU3RkRXJyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTiIpKQpybShnd2FzX3N1bXN0YXRzX0FBKQoKYGBgCgojIyMgQ29sb2NhbGl6YXRpb24KCk5vdyB3ZSBhcmUgcmVhZGluZyB0byBmb3JtYWxseSB0ZXN0IHRoZSBjb2xvY2FsaXphdGlvbiBwZXIgdHJhaXQuIE5vdGUgdGhhdCBgdHJhaXQgMWAgPSBFdXJvcGVhbiBhbmNlc3RyeTsgYHRyYWl0IDJgID0gQWZyaWNhbi1BbWVyaWNhbiBhbmNlc3RyeS4KCmBgYHtyfQpmb3IoVkFSSUFOVCBpbiB2YXJpYW50c19vZl9pbnRlcmVzdCl7CiAgY2F0KHBhc3RlMCgiR2V0dGluZyBkYXRhIGZvciAiLCBWQVJJQU5ULCIuXG4iKSkKCiAgdGVtcENIUiA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWyw1XQogIHRlbXBTVEFSVCA8LSBzdWJzZXQodmFyaWFudF9saXN0LCByc0lEID09IFZBUklBTlQpWywxN10KICB0ZW1wRU5EIDwtIHN1YnNldCh2YXJpYW50X2xpc3QsIHJzSUQgPT0gVkFSSUFOVClbLDE4XQogIHRlbXBWQVJJQU5UbnIgPC0gc3Vic2V0KHZhcmlhbnRfbGlzdCwgcnNJRCA9PSBWQVJJQU5UKVssMV0KCiAgY2F0KCJcblN1YnNldCByZXF1aXJlZCBkYXRhLlxuIikKICB0ZW1wMSA8LSBzdWJzZXQoZ3dhc19zdW1zdGF0c19yYWNlcl9FQSwgQ2hyID09IHRlbXBDSFIgJiAoUG9zaXRpb24gPj0gdGVtcFNUQVJUICYgUG9zaXRpb24gPD0gdGVtcEVORCkpCiAgdGVtcDIgPC0gc3Vic2V0KGd3YXNfc3Vtc3RhdHNfcmFjZXJfQUEsIENociA9PSB0ZW1wQ0hSICYgKFBvc2l0aW9uID49IHRlbXBTVEFSVCAmIFBvc2l0aW9uIDw9IHRlbXBFTkQpKQoKICBjYXQoIlxuQ2hlY2sgdGVtcDEgZGF0YS5cbiIpCiAgdGVtcDEgPC0gcmVuYW1lX3dpdGgodGVtcDEsIHRvbG93ZXIpCiAgCiAgIyBjb3JyZWN0aW5nIGNvbHVtbiBuYW1lcwogIHRlbXAxIDwtIHJlbmFtZSh0ZW1wMSwgYmV0YSA9IGVmZmVjdCkKICB0ZW1wMSA8LSByZW5hbWUodGVtcDEsIHNlID0gc3RkZXJyKQogIHRlbXAxIDwtIHJlbmFtZSh0ZW1wMSwgc25wID0gcnNpZCkKICAKICAjIGNhbGN1bGF0aW5nIHRoaW5ncwogIHRlbXAxJHZhcmJldGEgPC0gdGVtcDEkc2VeMgogIAogIHRlbXAxIDwtIGFzLmxpc3QodGVtcDEpICMgY3JpdGljYWwsIGFzIGNvbG9jIGV4cGVjdHMgYSBsaXN0IG9mIHZhcmlhYmxlcwogIAogIHRlbXAxJHR5cGUgPC0gInF1YW50IgogIHRlbXAxJHNkWSA8LSAxCgogIGNvbG9jOjpjaGVja19kYXRhc2V0KHRlbXAxLCB3YXJuLm1pbnAgPSAxZS0xMCkKICAKICBjYXQoIlxuQ2hlY2sgdGVtcDIgZGF0YS5cbiIpCiAgdGVtcDIgPC0gcmVuYW1lX3dpdGgodGVtcDIsIHRvbG93ZXIpCiAgCiAgIyBjb3JyZWN0aW5nIGNvbHVtbiBuYW1lcwogIHRlbXAyIDwtIHJlbmFtZSh0ZW1wMiwgYmV0YSA9IGVmZmVjdCkKICB0ZW1wMiA8LSByZW5hbWUodGVtcDIsIHNlID0gc3RkZXJyKQogIHRlbXAyIDwtIHJlbmFtZSh0ZW1wMiwgc25wID0gcnNpZCkKICAKICAjIGNhbGN1bGF0aW5nIHRoaW5ncwogIHRlbXAyJHZhcmJldGEgPC0gdGVtcDIkc2VeMgogIAogIHRlbXAyIDwtIGFzLmxpc3QodGVtcDIpICMgY3JpdGljYWwsIGFzIGNvbG9jIGV4cGVjdHMgYSBsaXN0IG9mIHZhcmlhYmxlcwogIAogIHRlbXAyJHR5cGUgPC0gInF1YW50IgogIHRlbXAyJHNkWSA8LSAxCgogIGNvbG9jOjpjaGVja19kYXRhc2V0KHRlbXAyLCB3YXJuLm1pbnAgPSAxZS0xMCkKICAKICBjYXQoIlxuUGxvdCByZXF1aXJlZCBkYXRhLlxuIikKICBwbG90X2RhdGFzZXQodGVtcDEpCiAgcGxvdF9kYXRhc2V0KHRlbXAyKQoKICByZXNfdGVtcDFfdnNfdGVtcDJfc2luZ2xlIDwtIGNvbG9jLmFiZihkYXRhc2V0MSA9IHRlbXAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0MiA9IHRlbXAyKQoKICBjYXQoIlxuQ29sb2NhbGl6YXRpb24uXG4iKQogIHByaW50KHJlc190ZW1wMV92c190ZW1wMl9zaW5nbGUpCiAgd3JpdGVfbGluZXMocmVzX3RlbXAxX3ZzX3RlbXAyX3NpbmdsZSwgZmlsZSA9IHBhc3RlMChDT0xPQ19FQV92c19BQV9sb2MsICIvcmVzX0VBX3ZzX0FBX3NpbmdsZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFZBUklBTlRuciwiLiIsdGVtcENIUiwiXyIsdGVtcFNUQVJULCJfIix0ZW1wRU5ELCIudHh0IikpCgogIGNvbG9jOjpzZW5zaXRpdml0eShyZXNfdGVtcDFfdnNfdGVtcDJfc2luZ2xlLCAiSDQgPiAwLjkiKQogIAogICMgU3RlcCAxOiBDYWxsIHRoZSBwZGYgY29tbWFuZCB0byBzdGFydCB0aGUgcGxvdAogIHBkZihmaWxlID0gcGFzdGUwKENPTE9DX0VBX3ZzX0FBX2xvYywgIi9yZXNfRUFfdnNfQUFfc2luZ2xlLiIsCiAgICAgICAgICAgICAgICAgICAgdGVtcFZBUklBTlRuciwiLiIsdGVtcENIUiwiXyIsdGVtcFNUQVJULCJfIix0ZW1wRU5ELCIucGRmIikpICAgIyBUaGUgZGlyZWN0b3J5IHlvdSB3YW50IHRvIHNhdmUgdGhlIGZpbGUgaW4KICAjIFN0ZXAgMjogQ3JlYXRlIHRoZSBwbG90IHdpdGggUiBjb2RlCiAgY29sb2M6OnNlbnNpdGl2aXR5KHJlc190ZW1wMV92c190ZW1wMl9zaW5nbGUsICJINCA+IDAuOSIpCgogICMgU3RlcCAzOiBSdW4gZGV2Lm9mZigpIHRvIGNyZWF0ZSB0aGUgZmlsZSEKICBkZXYub2ZmKCkKICAKICBybSh0ZW1wMSwgdGVtcDIsCiAgICAgIyBwMSxwMiwKICAgICAjIHRlbXBfZjEsIHRlbXBfZl9sZDEsCiAgICAgIyB0ZW1wX2YyLCB0ZW1wX2ZfbGQyLAogICAgIHRlbXBDSFIsIHRlbXBTVEFSVCwgdGVtcEVORCwKICAgICBWQVJJQU5ULCB0ZW1wVkFSSUFOVG5yKQogIAp9CgpgYGAKCiMjIyBTdW1tYXJ5IGNvbG9jYWxpemF0aW9uCgpfRU5QUDFfL19FTlBQM18gbG9jdXMKCkZpbGU6IHJlc19FQV92c19BQV9zaW5nbGUuMS42XzEzMTU5NTAwMl8xMzI1OTUwMDIudHh0CgpjKG5zbnBzID0gODkxLCBQUC5IMC5hYmYgPSAwLjIxMjcyNjE4MDQzNjk0NSwgUFAuSDEuYWJmID0gMC4wNjkwNzQzNjczNjc3ODE1LCBQUC5IMi5hYmYgPSAwLjAyMTQ3MjM3NjQ2MDA0NTUsIFBQLkgzLmFiZiA9IDAuMDA2MjgxODU1MTE3ODQ1NzgsIFBQLkg0LmFiZiA9IDAuNjkwNDQ1MjIwNjE3MzgzKQoKKipDb25jbHVzaW9uOiA2OS4wJSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBsb2N1cyBpcyBzaGFyZWQgYmV0d2VlbiBib3RoIGFuY2VzdHJpZXMgYW5kIGluY2x1ZGVzIHRoZSBzYW1lIGNhdXNhbCB2YXJpYW50LioqCgoKX0lHRkJQM18gbG9jdXMKCkZpbGU6IHJlc19FQV92c19BQV9zaW5nbGUuMi43XzQ1NDYwNjQ1XzQ2NDYwNjQ1LnR4dAoKYyhuc25wcyA9IDExNDcsIFBQLkgwLmFiZiA9IDAuNTk4NzY5NTU1NTUzNzIyLCBQUC5IMS5hYmYgPSAwLjEwODAzMDAyMDk1MDk3OCwgUFAuSDIuYWJmID0gMC4wNjg1NTgxNzEyNjM2MjU3LCBQUC5IMy5hYmYgPSAwLjAxMjE1Njc4MTgxOTk0MTksIFBQLkg0LmFiZiA9IDAuMjEyNDg1NDcwNDExNzMyKQoKKipDb25jbHVzaW9uOiA1OS45JSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBsb2N1cyBpcyBub3QgYXNzb2NpYXRlZCBpbiBlaXRoZXIgYW5jZXN0cnksIGJ1dCAxMC44IHRoYXQgaXQgaXMgRXVyb3BlYW4tc3BlY2lmaWMsIGFuZCAyMS4yJSB0aGF0IGl0IGlzIHNoYXJlZCBiZXR3ZWVuIGJvdGggYW5jZXN0cmllcyBhbmQgaW5jbHVkZXMgdGhlIHNhbWUgY2F1c2FsIHZhcmlhbnQuKioKCgpfQ1hDTDEyXyBsb2N1cwoKRmlsZTogcmVzX0VBX3ZzX0FBX3NpbmdsZS4zLjEwXzQ0MDE1NzE2XzQ1MzM0NzIwLnR4dAoKYyhuc25wcyA9IDE2NDEsIFBQLkgwLmFiZiA9IDAuMDAxMzE5NTY3ODU3Njk2MDgsIFBQLkgxLmFiZiA9IDAuODQ3Njg5MjA1NzA4Njc4LCBQUC5IMi5hYmYgPSAwLjAwMDE2NjkyNTg3Mjk4NjAxNywgUFAuSDMuYWJmID0gMC4xMDcxODkzOTU4NjI1MTIsIFBQLkg0LmFiZiA9IDAuMDQzNjM0OTA0Njk4MTI4MSkKCioqQ29uY2x1c2lvbjogODQuOCUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgbG9jdXMgaXMgRXVyb3BlYW4tc3BlY2lmaWMsIGJ1dCA0LjMtMTAuNyUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgbG9jdXMgaXMgc2hhcmVkIGJldHdlZW4gYm90aCBhbmNlc3RyaWVzLioqCgoKX0FSSUQ1Ql8gbG9jdXMKCkZpbGU6IHJlc19FQV92c19BQV9zaW5nbGUuNC4xMF82MzMzNjA4OF82NDMzNjA4OC50eHQKCmMobnNucHMgPSA4MzAsIFBQLkgwLmFiZiA9IDAuMTUzNjg2MjE3ODU2MjY4LCBQUC5IMS5hYmYgPSAwLjUyMzk5NzQyNTc5MDcyLCBQUC5IMi5hYmYgPSAwLjAxNTUzODYyOTk1NDE0MzMsIFBQLkgzLmFiZiA9IDAuMDUyNzI1MzM3NzYwMDYzNSwgUFAuSDQuYWJmID0gMC4yNTQwNTIzODg2Mzg4MDUpCgoqKkNvbmNsdXNpb246IDUyLjQlIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIEV1cm9wZWFuLXNwZWNpZmljLCBidXQgMjUuNCUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgbG9jdXMgaXMgc2hhcmVkIGJldHdlZW4gYm90aCBhbmNlc3RyaWVzIGFuZCBpbmNsdWRlcyBkaWZmZXJlbnQgY2F1c2FsIHZhcmlhbnRzLioqCgoKX0FES18gbG9jdXMKCkZpbGU6IHJlc19FQV92c19BQV9zaW5nbGUuNS4xMF83NTQxNzQzMV83NjQxNzQzMS50eHQKCmMobnNucHMgPSAyNjMsIFBQLkgwLmFiZiA9IDAuMDYwNzcwNjM2NzYxMTgxNSwgUFAuSDEuYWJmID0gMC44NTIxMzA2NjQ4MzQzOCwgUFAuSDIuYWJmID0gMC4wMDE2Njk3OTc2MTMyMzAxNCwgUFAuSDMuYWJmID0gMC4wMjMzNTE5NTY5NzM0NTY1LCBQUC5INC5hYmYgPSAwLjA2MjA3Njk0MzgxNzc1MjIpCgoqKkNvbmNsdXNpb246IDg1LjIlIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIEV1cm9wZWFuLXNwZWNpZmljLCBidXQgMi4zLTYuMiUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgbG9jdXMgaXMgc2hhcmVkIGJldHdlZW4gYm90aCBhbmNlc3RyaWVzLioqCgoKX0ZHRjIzXyBsb2N1cwoKRmlsZTogcmVzX0VBX3ZzX0FBX3NpbmdsZS42LjEyXzM5ODY2MThfNDk4NjYxOC50eHQKCmMobnNucHMgPSA5MTYsIFBQLkgwLmFiZiA9IDAuMDA0NDY0NzI0MjYzNTQ3NDksIFBQLkgxLmFiZiA9IDAuNzA2OTM2MDkxMDg2NjAyLCBQUC5IMi5hYmYgPSAwLjAwMTA0Nzk2MDMyNDQ3Mzc4LCBQUC5IMy5hYmYgPSAwLjE2NTgxMDMzNzI1ODQ5MywgUFAuSDQuYWJmID0gMC4xMjE3NDA4ODcwNjY4ODMpCgoqKkNvbmNsdXNpb246IDcwLjclIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIEV1cm9wZWFuLXNwZWNpZmljLCBidXQgMTIuMi0xNi42JSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBsb2N1cyBpcyBzaGFyZWQgYmV0d2VlbiBib3RoIGFuY2VzdHJpZXMuKioKCgpfQ09MNEExXy9fQ09MNEEyXyBsb2N1cwoKRmlsZTogcmVzX0VBX3ZzX0FBX3NpbmdsZS43LjEzXzExMDU0OTYyM18xMTE1NDk2MjMudHh0CgpjKG5zbnBzID0gMTQwMSwgUFAuSDAuYWJmID0gMC4xMDc4NzE3NjYwODU1MiwgUFAuSDEuYWJmID0gMC43MzkwMDQxNjQ3OTQ1NjIsIFBQLkgyLmFiZiA9IDAuMDE0MTk5OTM5ODc4NzYxNywgUFAuSDMuYWJmID0gMC4wOTcyMzg3NzE3MTcwMTYyLCBQUC5INC5hYmYgPSAwLjA0MTY4NTM1NzUyNDE0MDIpCgoqKkNvbmNsdXNpb246IDczLjklIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIEV1cm9wZWFuLXNwZWNpZmljLCBidXQgNC4xLTkuNyUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgbG9jdXMgaXMgc2hhcmVkIGJldHdlZW4gYm90aCBhbmNlc3RyaWVzLioqCgoKX01PUkY0TF8gbG9jdXMKCkZpbGU6IHJlc19FQV92c19BQV9zaW5nbGUuOC4xNV83ODYyMzk0Nl83OTYyMzk0Ni50eHQKCmMobnNucHMgPSA5ODQsIFBQLkgwLmFiZiA9IDkuOTI4NjIxNTY3MjQ0MTRlLTA1LCBQUC5IMS5hYmYgPSAwLjgxMTM5NTgwNDM1MzMxMSwgUFAuSDIuYWJmID0gMS44MjA2MTQ2ODU4NTk5OGUtMDUsIFBQLkgzLmFiZiA9IDAuMTQ4NzQ2MTgxODE4ODk0LCBQUC5INC5hYmYgPSAwLjAzOTc0MDUyMTQ2NTI2MjIpCgoqKkNvbmNsdXNpb246IDgxLjElIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIEV1cm9wZWFuLXNwZWNpZmljLCBidXQgMTQuOSUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgbG9jdXMgaXMgc2hhcmVkIGJldHdlZW4gYm90aCBhbmNlc3RyaWVzIGFuZCBpbmNsdWRlcyBkaWZmZXJlbnQgY2F1c2FsIHZhcmlhbnRzLioqCgoKX1BIQUNUUjFfIGxvY3VzCgpGaWxlOiByZXNfRUFfdnNfQUFfc2luZ2xlLjkuNl8xMjQwMzk1N18xMzQwMzk1Ny50eHQKCmMobnNucHMgPSAxMDgyLCBQUC5IMC5hYmYgPSAyLjY0MzQ5OTE2ODA4OTc0ZS0yMSwgUFAuSDEuYWJmID0gMC40NDAxMTA3NjQzOTAzNzEsIFBQLkgyLmFiZiA9IDEuODU3MDYyNDkzNDY0NDdlLTIyLCBQUC5IMy5hYmYgPSAwLjAzMDM4ODM1MjM2OTE5NDcsIFBQLkg0LmFiZiA9IDAuNTI5NTAwODgzMjQwNDM3KQoKKipDb25jbHVzaW9uOiA0NC4wJSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBsb2N1cyBpcyBFdXJvcGVhbi1zcGVjaWZpYywgYnV0IDUyLjklIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIHNoYXJlZCBiZXR3ZWVuIGJvdGggYW5jZXN0cmllcyBhbmQgaW5jbHVkZXMgdGhlIHNhbWUgY2F1c2FsIHZhcmlhbnQuKioKCgpfQ0RLTjJBXy9fQ0RLTjJCXyBsb2N1cwoKRmlsZTogcmVzX0VBX3ZzX0FBX3NpbmdsZS4xMC45XzIxNjI0NzQ0XzIyNjI0NzQ0LnR4dAoKYyhuc25wcyA9IDExNzUsIFBQLkgwLmFiZiA9IDMuODE5NDg0ODAwNTI0OGUtMzgsIFBQLkgxLmFiZiA9IDAuNDAzNzA3NzIxNTI5MDMsIFBQLkgyLmFiZiA9IDMuNzAzNDk5NjA3NzU1NjJlLTM5LCBQUC5IMy5hYmYgPSAwLjAzODU4NzEzOTQyNTQ2OTUsIFBQLkg0LmFiZiA9IDAuNTU3NzA1MTM5MDQ1NDk0KQoKKipDb25jbHVzaW9uOiA0MC40JSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBsb2N1cyBpcyBFdXJvcGVhbi1zcGVjaWZpYywgYnV0IDU1LjglIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIHNoYXJlZCBiZXR3ZWVuIGJvdGggYW5jZXN0cmllcyBhbmQgaW5jbHVkZXMgdGhlIHNhbWUgY2F1c2FsIHZhcmlhbnQuKioKCgpfQVBPRV8gbG9jdXMKCkZpbGU6IHJlc19FQV92c19BQV9zaW5nbGUuMTEuMTlfNDQ5MTIwNzlfNDU5MTIwNzkudHh0CgpjKG5zbnBzID0gOTU4LCBQUC5IMC5hYmYgPSAwLjAxMDk0NTE2NjM1NjMyMjksIFBQLkgxLmFiZiA9IDAuNjQ5MTI0MDkyNDkxNzgyLCBQUC5IMi5hYmYgPSAwLjAwNDAxODM0NTY5Njg1NDkxLCBQUC5IMy5hYmYgPSAwLjIzODIxODAwNzYxOTA0NSwgUFAuSDQuYWJmID0gMC4wOTc2OTQzODc4MzU5OTQ3KQoKKipDb25jbHVzaW9uOiA2NC45JSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBsb2N1cyBpcyBFdXJvcGVhbi1zcGVjaWZpYywgYnV0IDIzLjglIHByb2JhYmlsaXR5IHRoYXQgdGhlIGxvY3VzIGlzIHNoYXJlZCBiZXR3ZWVuIGJvdGggYW5jZXN0cmllcyBhbmQgaW5jbHVkZXMgZGlmZmVyZW50IGNhdXNhbCB2YXJpYW50cy4qKgoKCk92ZXJhcmNoaW5nIGNvbmNsdXNpb25zOgoKMS4gVGhlIEV1cm9wZWFuLXNwZWNpZmljIGFuYWx5c2lzIGlzIGJldHRlciBwb3dlcmVkIHRoYW4gdGhlIEFmcmljYW4tQW1lcmljYW4tc3BlY2lmaWMgYW5hbHlzaXMKMi4gVGFraW5nIGludG8gYWNjb3VudCB0aGUgaXNzdWVzIG9mIHBvd2VyLCBpdCBpcyBtb3JlIGxpa2VseSB0aGF0IHRoZSBtYWpvcml0eSBvZiBsb2NpIGFyZSBzaGFyZWQgYmV0d2VlbiBhbmNlc3RyaWVzLiBUaGUgX0FES18gYW5kIF9DT0w0QTFfL19DT0w0QTJfIGxvY2kgYXJlIHRoZSBsZWFzdCBzaGFyZWQgYmV0d2VlbiBhbmNlc3RyaWVzLCBhbmQgYm90aCBhbmFseXNlcyBhcmUgd2VsbC1fdW5kZXJfcG93ZXJlZCBmb3IgdGhlIF9JR0ZCUDNfIGxvY3VzLiAKMy4gR2l2ZW4gc3VmZmljaWVudCBhbmQgbW9yZSBlcXVhbCBzYW1wbGUgc2l6ZXMgYmV0d2VlbiBhbmNlc3RyaWVzIG1vcmUgZmlybSBjb25jbHVzaW9ucyBjb3VsZCBiZSBkcmF3biwgYnV0IGFwcGx5aW5nIE9jY2FtJ3MgcmF6b3IgaXQgaXMgbW9yZSBsaWtlbHkgdGhhdCB0aGVzZSBsb2NpIGFyZSBzaGFyZWQgYmV0d2VlbiBhbmNlc3RyaWVzIHRoYW4gbm90LgoKIyBTZXNzaW9uIGluZm9ybWF0aW9uCgotLS0tLS0KCiAgICBWZXJzaW9uOiAgICAgIHYxLjQuMgogICAgTGFzdCB1cGRhdGU6ICAyMDIyLTA2LTI4CiAgICBXcml0dGVuIGJ5OiAgIFNhbmRlciBXLiB2YW4gZGVyIExhYW4gKHMudy52YW5kZXJsYWFuLTJbYXRddW1jdXRyZWNodC5ubCkuCiAgICBEZXNjcmlwdGlvbjogIFNjcmlwdCB0byBjcmVhdGUgcGxvdCByZWdpb25hbCBhc3NvY2lhdGlvbiBwbG90cy4KICAgIE1pbmltdW0gcmVxdWlyZW1lbnRzOiBSIHZlcnNpb24gMy40LjMgKDIwMTctMDYtMzApIC0tICdTaW5nbGUgQ2FuZGxlJywgTWFjIE9TIFggRWwgQ2FwaXRhbgogICAgCiAgICBDaGFuZ2VzIGxvZwogICAgKiB2MS40LjIgQWRkZWQgZm9ybWFsIHF1YW50aWZpY2F0aW9uIG9mIGNvbG9jYWxpemF0aW9uIGJldHdlZW4gYW5jZXN0cmllcy4KICAgICogdjEuNC4xIEFkZGVkIG1pcnJvciBwbG90cyBhbmQgc2NhdHRlciBwbG90cy4KICAgICogdjEuNC4wIFVwZGF0ZSB3aXRoIEFBIGRhdGEuCiAgICAqIHYxLjMuMCBBZGRlZCB0aGUgY3JlZGlibGUgc2V0cyB0byB0aGUgYWRpdGlvbmFsIHJlZ2lvbnMuCiAgICAqIHYxLjIuMCBBZGRlZCBpbiBhZGl0aW9uYWwgcmVnaW9ucy4KICAgICogdjEuMS4wIENyZWF0ZWQgUE5HIGFuZCBQREYgb2YgdG9wIGxvY2kgcmVnaW9ucy4KICAgICogdjEuMC4wIEluaXRpYWwgdmVyc2lvbi4gCgotLS0tLS0KCmBgYHtyIGV2YWwgPSBUUlVFfQpzZXNzaW9uSW5mbygpCgpgYGAKCgojIFNhdmluZyBlbnZpcm9ubWVudApgYGB7ciBTYXZpbmd9CnNhdmUuaW1hZ2UocGFzdGUwKFBST0pFQ1RfbG9jLCAiLyIsVG9kYXksIi4iLFBST0pFQ1ROQU1FLCIuUmVnaW9uYWxBc3NvY2lhdGlvblBsb3RzLlJEYXRhIikpCgpgYGAKCgotLS0tLS0KPHN1cD4mY29weTsgMTk3OS0yMDIyIFNhbmRlciBXLiB2YW4gZGVyIExhYW4gfCBzLncudmFuZGVybGFhblthdF1nbWFpbC5jb20gfCBbc3d2YW5kZXJsYWFuLmdpdGh1Yi5pb10oaHR0cHM6Ly9zd3ZhbmRlcmxhYW4uZ2l0aHViLmlvKS48L3N1cD4KLS0tLS0tCgogIAo=